Piping find -name in xargs risulta nei nomi di file con spazi non passati al comando

22

Normalmente per rimuovere 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

Questo non cancellerà i file con spazi in essi.

    
posta Ashley 26.08.2015 - 14:13

3 risposte

41

Puoi dire find e xargs a entrambi usare terminatori null

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

o (più semplice) usa l'azione -delete di find

find . -name "*.txt" -delete

o (grazie a @kos)

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

ognuno dei quali dovrebbe rispettare il limite di ARG_MAX del sistema senza la necessità di xargs .

    
risposta data steeldriver 26.08.2015 - 14:19
1

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

Eg. il seguente modulo elimina gli ultimi 10 file modificati in una directory, anche se hanno spazi nei loro nomi.

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

    
risposta data Ibrahim 04.05.2017 - 00:00
0

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

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

Risposta sorgente su SO .

    
risposta data joseph_morris 13.04.2018 - 22:48

Leggi altre domande sui tag