Ich möchte alle Dateien in einem Verzeichnis entfernen, während nur einige angegebene Dateien übrig bleiben. Sie haben namentlich nichts gemeinsam. Wie könnte ich das erreichen?
Die Dateinamen, die ich behalten möchte, sind beispielsweise:
file_1.png
, another_file.jpg
,some_music.mp3
command-line
files
rm
AGamePlayer
quelle
quelle
shopt -u extglob
).Erstellen Sie ein Unterverzeichnis
tmp
, verschieben Sie alle Dateien, die Sie behalten möchten, in dieses Verzeichnis und führen Sie anschließend eine Datei durchrm -f *
. Dastmp
Verzeichnis wird davon nicht betroffen .Danach machen Sie einfach:
(Angenommen, keine der von Ihnen verschobenen Dateien beginnt mit einem Punkt).
Dies ist einer der wenigen Fälle, in denen es sinnvoll ist, die Maus und einen Dateibrowser wie Nautilus zu verwenden, in denen Sie tatsächlich Ctrlauf die wenigen Dateien klicken können, die Sie behalten möchten, und dann das Menü verwenden:
Edit -> Invert Selection
um die anderen Dateien abzurufen und diese dann zu löschen .quelle
ls
um festzustellen, ob Sie keine der Dateien verpasst haben, die Sie beibehalten möchten.Fügen Sie die Namen der Dateien, die Sie behalten möchten, zu einer Textdatei hinzu, eine pro Zeile. Diese Datei sollte sich nicht im Verzeichnis befinden oder Sie sollten auch ihren Namen hinzufügen.
Wenn der Name Ihres Verzeichnisses foo und der Name der Datei bar ist , gehen Sie wie folgt vor.
Dies bewirkt Folgendes:
find -type f
sucht nach den Namen aller Dateien in foo und seinen Unterverzeichnissen und druckt sie in STDOUT aus. Mit der Option werden-print0
die Dateinamen mit NUL-Bytes begrenzt.grep -v -f bar
schließt alle Dateinamen aus, die mit einer Zeile in der Leiste übereinstimmen . Mit Option-z
behandelt es seine Eingabe als eine Reihe von Zeilen, die durch NUL-Byte begrenzt sind, mit Option begrenzt-Z
es seine Ausgabe mit einem NUL-Byte.xargs rm
ruftrm
wiederholt auf, um die Dateien zu löschen. Mit der Option-0
wird die Eingabe als eine Reihe von Zeilen behandelt, die durch das NUL-Byte begrenzt sind.Dies funktioniert mit Dateinamen, die Leerzeichen enthalten.
quelle
find
würde ich lieber tunfind . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -vi {} +