
Ich habe eine große Menge an E-Books, die sehr unorganisiert sind. Einige davon liegen allein in ihren eigenen Verzeichnissen, einige sind beschädigt, einige der Verzeichnisse sind leer. Wie sammle ich meine E-Books aus all diesen verschiedenen Verzeichnissen und lege sie alle in einen Ordner, damit ich sie lesen und neu organisieren kann? Ich würde lieber native GNU-Befehle oder ein Bash-Skript verwenden.
Antwort1
Ich gehe davon aus, dass Sie sie alle zumindest in verschiedenen Unterverzeichnissen unter einem einzigen übergeordneten Ordner haben. So etwas wie ~/mybooks
. Wenn ja, können Sie Folgendes tun:
find ~/mybooks -name '*.pdf' -or -name '*.epub' -exec mv -t ~/newdir {} +
Dadurch werden alle Dateien oder Verzeichnisse gefunden, deren Name mit .pdf
oder .epub
im Verzeichnis endet ~/mybooks
, und in das Verzeichnis verschoben ~/newdir
. Wenn Sie Verzeichnisse haben können, deren Name mit .pdf
oder endet .epub
, fügen Sie die -type f
Direktive hinzu, um nur Dateien abzurufen:
find ~/mybooks -type f -name '*.pdf' -or -name '*.epub' -exec mv -t ~/newdir {} +
Antwort2
So verschieben Sie alle Dateien mit bestimmten Erweiterungen in einem Verzeichnisbaum (also rekursiv in einem Verzeichnis und seinen Unterverzeichnissen) in ein einzelnes Verzeichnis in zsh:
mv -i source/**/*.(pdf|epub) destination/
Das destination
Verzeichnis muss bereits vorhanden sein. Sie können den source/
Teil weglassen, wenn Sie Dateien im aktuellen Verzeichnis und seinen Unterverzeichnissen sammeln möchten. Wenn Sie alle Dateien unabhängig von ihrem Namen verschieben möchten, aber nicht die Verzeichnisse:
mv -i source/**/*(.) destination/
In Bash:
shopt -s extglob globstar
mv -i source/**/*.@(pdf|epub) destination/
Diese Befehle beschweren sich möglicherweise, dass die Befehlszeile zu lang ist, wenn Sie viele Dateien haben. In diesem Fall können Sie find
anstelle des rekursiven Globbings aufrufen.
find source -name '*.pdf' -o -name '*.epub' -exec mv -i -t destination/ {} +
find source -type f -exec mv -i -t destination/ {} +
Wenn die vorhandene Verzeichnisstruktur einige Informationen enthält, dann ist es möglicherweise bequemer, statt der Dateien zu verschieben,Hardlinksodersymbolische Links.
Um Hardlinks zu erstellen, rufen Sie ln
anstelle von auf mv -i
. Mit Hardlinks ist jede Datei an beiden Orten gleichzeitig vorhanden. Wenn Sie entweder die ursprüngliche oder die neue Datei entfernen, bleibt die andere erhalten: Die beiden Speicherorte der Datei sind gleichberechtigt. Sie können erkennen, dass eine Datei Hardlinks hat, wenn die Zahl in der zweiten Spalte der Ausgabe von ls -l
größer als 1 ist.
Um symbolische Links zu erstellen, wechseln Sie zuerst in das Zielverzeichnis und rufen Sie ln -s
using .
(steht für das aktuelle Verzeichnis) als Ziel auf. Ein symbolischer Link ist eine Datei, die nur sagt: „Schau dir stattdessen diese Datei dort an.“ Wenn Sie den symbolischen Link entfernen, hat dies keine Auswirkungen auf die Originaldatei. Wenn Sie die Originaldatei verschieben oder entfernen, wird der symbolische Link baumelnd (d. h. er ist noch da, zeigt aber nicht mehr auf eine Datei).
Um leere Verzeichnisse unter einem Verzeichnis zu entfernen, können Sie verwenden
find /some/directory -depth -type d -empty -delete