Come utilizzare il comando find per eliminare i file corrispondenti a un modello?


17

Sto cercando di scrivere un comando bash che eliminerà tutti i file corrispondenti a un modello specifico - in questo caso, sono tutti i vecchi file di registro di vmware che si sono creati.

Ho provato questo comando:

find . -name vmware-*.log | xargs rm

Tuttavia, quando eseguo il comando, si blocca su tutte le cartelle che hanno spazi nei loro nomi. C'è un modo per formattare il percorso del file in modo che xargs lo passi a rm citato o correttamente salvato?


Risposte:


20

Trovo generalmente che usare l' -execopzione per findessere più facile e meno confuso. Prova questo:

find . -name vmware-*.log -exec rm -i {} \;

Tutto ciò che segue -execviene considerato un comando da eseguire per ogni risultato, fino a ;, che viene evaso qui in modo che venga passato find. Il {}è sostituito con il nome del file che findnormalmente la stampa.

Dopo aver verificato che fa quello che vuoi, puoi rimuovere il -i.


1
Inoltre, se si tratta solo di file che si desidera eliminare e non di directory, è possibile aggiungere '' -type f '' al comando find.
JamesHannah,

18

Se hai GNU findpuoi usare l' -deleteopzione:

find . -name "vmware-*.log" -delete

Per utilizzare xargsed evitare il problema con spazi nei nomi dei file:

find . -name vmware-*.log -print0 | xargs -0 rm

Tuttavia, i file di registro non devono contenere spazi nei loro nomi. È probabile che siano presenti documenti di elaborazione testi e file MP3, ma dovresti essere in grado di controllare i nomi dei tuoi file di registro.


È pulito. Non lo sapevo.
Jeff Snider,

8

Puoi dire finddi delimitare l'elenco di output con NULL e xargsdi ricevere lo stesso elenco di input:

$ ls -l "file 1" "file 2"
-rw-r--r-- 1 james james 0 Oct 19 13:28 file 1
-rw-r--r-- 1 james james 0 Oct 19 13:28 file 2

$ find . -name 'file *' -print0 | xargs -0 ls -l
-rw-r--r-- 1 james james 0 Oct 19 13:28 ./file 1
-rw-r--r-- 1 james james 0 Oct 19 13:28 ./file 2

$ find . -name 'file *' -print0 | xargs -0 rm -v
removed `./file 2'
removed `./file 1'

Inoltre, assicurati di sfuggire a *, sia con una barra rovesciata, sia contenendo le vmware-*.logvirgolette singole, altrimenti la tua shell potrebbe tentare di espanderla prima di passarla find.


6

Non dimenticare l' -deleteopzione di ricerca. Rimuove il file senza errori con caratteri speciali ...

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.