2013-01-12 10 views
7

mi piacerebbe farlo in OS X:OS X: elenco e rimuovere i file con spazi

ls -rt | xargs rm -i 

Tuttavia, rm sta soffocando sul fatto che alcuni dei file sono spazi bianchi.

Ho menzionato OS X perché la versione BSD di ls non ha un flag -Q.

C'è un modo per farlo senza dover utilizzare find -print0?

risposta

0

Prova questa

while read -u 3 
do 
    rm -i "$REPLY" 
done 3< <(ls -rt) 
+0

Supponendo che l'analisi dell'output di 'ls' sia accettabile e il numero di file sia piccolo, funziona bene, tranne che non è necessario il descrittore di file personalizzato' 3'; solo '<<(ls -rt)' e 'read' senza' -u 3' funzionerà. Inoltre, per essere completamente affidabile, 'read -r', dovrebbe essere usato per evitare l'interpretazione dei backlashes. – mklement0

0

Basta trovare per eliminarlo.

find . -print -depth 1 -exec rm -i {} \; 

È più flessibile, dovrebbe essere ok con gli spazi.

2
[[email protected] staCK]$ touch "file name"{1..5}.txt 
[[email protected] staCK]$ ls -1 
file name1.txt 
file name2.txt 
file name3.txt 
file name4.txt 
file name5.txt 
[[email protected] staCK]$ ls -rt | xargs -I{} rm -v {} 
removed `file name5.txt' 
removed `file name4.txt' 
removed `file name3.txt' 
removed `file name2.txt' 
removed `file name1.txt' 

O

[[email protected] staCK]$ ls -1 
file a 
file b 
file c 
file d 

[[email protected] staCK]$ OLDIFS=$IFS; IFS=$'\n'; for i in `ls -1` ; do rm -i $i ; done ; IFS=$OLDIFS 
rm: remove regular empty file `file a'? y 
rm: remove regular empty file `file b'? y 
rm: remove regular empty file `file c'? y 
rm: remove regular empty file `file d'? y 
+0

++ per l'approccio 'xargs -I {}'; il secondo approccio rende i nomi di file letterali soggetti al globbing (accidentale), a meno che non si disattivi il globing con 'set -f' (e lo si ripristini più tardi). – mklement0

1

Se si desidera eliminare tutti i file, cosa c'è di sbagliato con rm -i *?

Don't parse ls

0

Hai due opzioni. È possibile chiamare xargs -0 con l'opzione, che divide l'ingresso in argomenti che utilizzano caratteri NUL (\0) come delimitatori:

ls -rt | tr '\n' '\0' | xargs -0 rm -i 

oppure è possibile utilizzare l'opzione -I per dividere l'ingresso solo su nuove righe (\n) e chiamare il comando desiderato volta per ogni linea di ingresso:

ls -rt | xargs -I_ rm -i _ 

la differenza è che la prima versione solo chiamate rm volta, con tutti gli argomenti forniti come un singolo elenco, mentre la seconda si chiama rm singolarmente per ogni riga nell'input.