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.