Antworten:
Verwendung xargs
:
xargs rm < file # or
xargs -a file rm
Dies funktioniert jedoch nicht, wenn die Dateinamen / -pfade Zeichen enthalten, die maskiert werden sollen.
Wenn Ihre Dateinamen keine Zeilenumbrüche enthalten, haben Sie folgende Möglichkeiten:
tr '\n' '\0' < file | xargs -0 rm # or
xargs -a file -I{} rm {}
Alternativ können Sie das folgende Skript erstellen:
#!/bin/bash
if [ -z "$1" ]; then
echo -e "Usage: $(basename $0) FILE\n"
exit 1
fi
if [ ! -e "$1" ]; then
echo -e "$1: File doesn't exist.\n"
exit 1
fi
while read -r line; do
[ -n "$line" ] && rm -- "$line"
done < "$1"
Speichern unter /usr/local/bin/delete-from
, Ausführungserlaubnis erteilen:
sudo chmod +x /usr/local/bin/delete-from
Dann starte es mit:
delete-from /path/to/file/with/list/of/files
cat file
" in (ba) sh oder csh eingeben.
cat
ist ungewöhnlich, wie gerade gesagt, nutzen Sie aus stdin
! Schauen Sie sich seine aktualisierte Antwort an
Hier ist eine Möglichkeit, mit Dateinamen mit Leerzeichen, Backslashes und anderen seltsamen Zeichen umzugehen:
while read -r file; do rm -- "$file"; done < list.txt
Damit wird jede Zeile von gelesen list.txt
, gespeichert $file
und ausgeführt rm
. Das -r
stellt sicher, dass Backslashes wörtlich gelesen werden (so dass \t
a \
und a t
und nicht ein TAB übereinstimmen ). Das --
stellt sicher, dass es sich auch um Dateinamen handelt, die mit beginnen -
.
Sie können dies auch in Perl tun:
perl -lne '$k{$_}++; END{unlink for keys(%k)}' list.txt
Dieser liest jeden Dateinamen in den %k
Hash ein und unlink
löscht dann jeden von ihnen.
Durch Python.
import sys
import os
fil = sys.argv[1]
with open(fil) as f:
for line in f:
os.remove(line.rstrip('\n'))
Speichern Sie das obige Skript in einer Datei mit dem Namen "like" script.py
und führen Sie das Skript aus, indem Sie den folgenden Befehl auf dem Terminal ausführen.
python3 script.py file
file
ist eine Eingabedatei, in der der Pfad der Dateien gespeichert ist, die Sie tatsächlich entfernen möchten.
Ein anderer Weg dies zu tun:
Sie können die Datei vorbereiten, indem Sie sie zu einem Shell-Skript machen:
$ sed -E "s/^(.*)$/rm '\1'/" input_file
rm 'file1'
rm 'file2'
rm 'file with some spaces.ext'
Wenn Ihre Dateinamen möglicherweise ein einfaches Anführungszeichen ( '
) enthalten, können Sie diese leicht erweiterte Version verwenden, um sie zuerst zu maskieren:
$ sed -E "s/'/'\\\''; s/^(.*)$/rm '\1'/" input_file
rm 'file1'
rm 'file2'
rm 'file with some spaces.ext'
rm 'a file with "quotes"'
rm 'a file with '\''quotes'\'''
Und Sie können dies ausführen, indem Sie es weiterleiten an sh
:
$ sed -E "s/'/'\\\''; s/^(.*)$/rm '\1'/" input_file | sh
Soweit ich weiß, haben Sie eine Textdatei mit den Dateien mit den vollständigen Pfaden. Es gibt zwei Möglichkeiten:
In Ihrer Liste sind die Dateinamen durch Zeilenumbrüche getrennt, dh jede Zeile enthält den vollständigen Pfad zu einer Datei. In diesem Fall: Hier ist ein einfacher Ausweg:
for i in $(cat listOfFiles.txt); do
rm -f $i
done
Wenn Ihre Liste eine oder mehrere Zeilen mit Dateinamen enthält, die durch Leerzeichen oder Tabulatoren getrennt sind, finden Sie hier den Drill:
sed -i 's/\s\+/\n/g' listOfFiles.txt
Dadurch werden alle Leerzeichen in Zeilenumbrüche umgewandelt
for i in $(cat listOfFiles.txt); do
rm -f $i
done
Ja, es gibt viele Möglichkeiten, dies zu erreichen, aber dies ist ein sehr einfacher Ansatz.
cat
nicht erforderlich, können Siestdin
Umleitung verwenden:< file xargs rm