Il piping find -name su xargs comporta nomi di file con spazi non passati al comando


26

Normalmente per rimuovere i file con spazi nel loro nome file dovresti eseguire:

$ rm "file name"

ma se voglio rimuovere più file, ad esempio:

$ find . -name "*.txt" | xargs rm

Ciò non eliminerà i file con spazi all'interno.


Indovina qui: find -name "*\ *.txt" | xargs rmfunziona con file di due parole?
TheWanderer,

Risposte:


49

Puoi dire finde xargsutilizzare entrambi i terminatori null

find . -name "*.txt" -print0 | xargs -0 rm

o (più semplice) utilizzare l' -deleteazione integrata difind

find . -name "*.txt" -delete

o (grazie @kos)

find . -name "*.txt" -exec rm {} +

nessuno dei due dovrebbe rispettare il ARG_MAXlimite del sistema senza necessità xargs.


1
Non posso votarlo due volte duro :) dato che hai menzionato, ARG_MAXciterò anche che find . -name "*.txt" -exec rm {} \;sarebbe un "tiro sicuro"
kos,

3
Così dice il maestro: ricorda sempre xargs -0.
Giosuè,

1
Punto super importante: -print0deve essere l'ultima opzione (o almeno dopo -name "*.txt") altrimenti questo colpirà i file non più limitati a*.txt ...
Kev

1

Per inciso, se hai usato qualcosa di diverso da find, puoi usare tr per sostituire le newline con byte nulli.

Per esempio. il seguente liner cancella gli ultimi 10 file modificati in una directory, anche se hanno spazi nei loro nomi.

ls -tp | grep -v / | head -n 10 | tr "\n" "\0" | xargs -0 rm


Sì, questo funziona.
Peter Mortensen,

0

Il comando xargs utilizza schede, spazi e nuove linee come delimitatori per impostazione predefinita. Puoi dirgli di usare solo i caratteri di nuova riga ('\ n') con l'opzione -d:

find . -name "*.txt" | xargs -d '\n' rm

Risposta della fonte su SO .


Quella risposta menziona -0invece di -d(per xargs) per i sistemi BSD. Cosa usa Ubuntu? La risposta accettata qui utilizza -0. Cosa è corretto?
Peter Mortensen,
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.