Elimina i file ed escludi alcuni con find [duplicate]


2

Questa domanda ha già una risposta qui:

Era un vecchio problema. Sapevo come eliminare i file ed escluderne alcuni, come questo:

rm `find ~/temporary/Test\ 1 -mindepth 1 -maxdepth 1|grep -v 'A'`

ma il problema è la cartella 'Test 1' che contiene uno spazio nel nome, il risultato di find è stato

/home/owner/temporary/Test 1/B

Esso rende rm errore, come posso ripararlo?


Grazie, ma il mio problema più fastidioso sono gli spazi e altri caratteri speciali nei nomi dei file, quei metodi non possono risolverlo. E non so come cercare questo problema :-(
— John

1
Non cercare di analizzare l'output di find o ls. Non erano destinati ad avere il loro output analizzato, perché find può lavorare direttamente sui file: mywiki.wooledge.org/ParsingLs
— slhck

Ok, forse ho capito.
— John

Risposte:


1

Questa soluzione funziona anche con gli spazi, ma richiede un po 'di digitazione:

find -mindepth 1 -maxdepth 1 ! -name "peter" ! -name "paul & mary" -exec rm {} \+

O con più recente find versioni (findutils & gt; = 4.2.3):

find -mindepth 1 -maxdepth 1 ! -name "peter" ! -name "paul & mary" -delete

1
Il -print0 | xargs -0 la versione non è necessaria Puoi chiamare -exec rm {} \+ direttamente, che sarebbe più efficiente.
— slhck

@ slhck Grazie, ho aggiornato la mia risposta. Anche se l'efficienza è discutibile perché xargs porterebbe a meno rm chiama :)
— scai

Grazie scai! Funziona. Quando ho visto queste risposte, ho capito che sono semplici, forse ho bisogno di leggere più manuali.
— John

L'ho letto due volte, ma in qualche modo sono riuscito a non accorgermene. Ops.
— Hennes

1

Ecco la mia opinione:

$ mkdir -p temp\ 1/sub\ 1
$ touch temp\ 1/{one,two,three} temp\ 1/sub\ 1/{one,two,three}
$ tree temp\ 1/
temp\ 1/
├── one
├── sub\ 1
│   ├── one
│   ├── three
│   └── two
├── three
└── two

1 directory, 6 files
$ find temp\ 1/ -maxdepth 1 -mindepth 1 -type f ! -regex '.*/.*o.*' -exec rm -v {} \;
removed ‘temp 1/three’

Quindi i concetti chiave qui sono:

  1. Il -regex filtro con negazione ( ! prima dell'opzione) e il modello che è applicato a tutto il percorso del file trovato.
  2. Il -exec comando che ha il {} gettone sostituito con percorso correttamente citato. Ricorda di aggiungere il \; per segnare la fine della riga di comando.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.