2013-01-12 17 views
7

Ich mag würde dies in OS X tun:OS X: Liste und Entfernen von Dateien mit Leerzeichen

ls -rt | xargs rm -i 

ist jedoch rm auf der Tatsache, Würgen, dass einige der Dateien Leerzeichen haben.

Ich erwähne OS X, weil die BSD-Version ls kein -Q Flag hat.

Gibt es eine Möglichkeit, dies zu tun, ohne find -print0 zu verwenden?

Antwort

0

Versuchen Sie, diese

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

Angenommen, die 'ls' Ausgabe ist akzeptabel und die Anzahl der Dateien ist klein, dies funktioniert gut, außer dass es keinen benutzerdefinierten Dateideskriptor' 3' braucht; nur '<<(ls -rt)' und 'lesen' ohne' -u 3' werden tun. Um "robust" zu sein, sollte 'read -r' verwendet werden, um die Interpretation von Spielrauschen zu vermeiden. – mklement0

0

Haben Sie einfach finden, löschen Sie es für Sie.

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

Es ist flexibler, sollte mit Räumen in Ordnung sein.

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' 

ODER

[[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

++ für den 'xargs -I {}' Ansatz; Bei der zweiten Methode werden die literalen Dateinamen einem (zufälligen) Globbing unterzogen, es sei denn, Sie deaktivieren auch globing mit 'set -f' (und stellen es später wieder her). – mklement0

1

Wenn Sie alle Dateien löschen möchten, was mit rm -i * falsch?

Don't parse ls

0

Sie haben zwei Möglichkeiten. Sie können entweder rufen xargs mit der Option -0, die die Eingabe in Argumente mit NUL-Zeichen (\0) als Trennzeichen teilt:

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

oder Sie die Option -I können Sie die Eingabe auf Zeilenumbrüche nur aufzuspalten (\n) und rufen den gewünschten Befehl einmal für jede Zeile des Eingangs:

ls -rt | xargs -I_ rm -i _ 

der Unterschied ist, dass die erste Version nur Anrufe rm einmal alle als eine einzige Liste vorgesehen Argumente, während die zweiten rm einzeln ruft für jede Zeile in der Eingabe.

Verwandte Themen