Recmv
Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:
Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
Mit diesem Skript lassen sich alle Dateien, die auf ein bestimmtes Muster passen, wie zum Beispiel *.mp3, von einem Verzeichnis in ein anderes kopieren. Dabei bleibt die Unterverzeichnis-Struktur erhalten. Das Skript verwendet dazu rsync, das Paket muss dazu installiert sein. Das Skript entstand aus diesem Thread.
Quellcode¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #!/bin/bash #script recmv, zum rekursiven Verschieben von Dateien eines Typs if [ $# -lt 3 ] ; then echo 'recmv, Verwendung:' echo 'recmv srcdir tgtdir "muster"' echo 'Verschiebt rekursiv alle Dateien auf die muster passt, sowie alle Unterverzeichnisse' echo 'aus dem Verzeichnis srcdir in das Verzeichnis tgtdir.' exit 1 fi echo "Verschiebe $3 aus $1 in $2:" rsync -avz --include "*/" --include "$3" --exclude "*" $1 $2 find $1 -name "$3" -delete |
Durch Weglassen der letzten Zeile kann man die Dateien kopieren statt verschieben.
Version ohne rsync¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #!/bin/bash # script recmv, zum rekursiven Verschieben von Dateien eines Musters if [ $# -lt 3 ] ; then echo 'recmv, Verwendung:' echo 'recmv srcdir tgtdir "muster"' echo 'Verschiebt rekursiv alle Dateien auf die muster passt, sowie alle Unterverzeichnisse' echo 'aus dem Verzeichnis srcdir in das Verzeichnis tgtdir.' exit 1 fi # rekursive Funktion zum Erzeugen des aktuellen Verzeichnisses createDirs() { baseDir=$(dirname $1) # Ermittlung des uebergeordenten Verzeichnisses if [ \! -d $baseDir ] # Test auf Existenz des uebergeordenten Verzeichnisses then createDirs $baseDir # bei Nicht-Existenz Anlegen des uebergeordenten # Verzeichnis mit selber Funktion fi mkdir $1 # Anlegen des eigentlichen Verzeichnisses } tmpIFS=$IFS # Speichern des IFS (Internal Field Separator) IFS=$'\n' # da ich pro Zeile des find einmal die for-Schleife # durchlaufen will, ersetze ich den IFS mit einem # Zeilenumbruch echo "Verschiebe $3 aus $1 in $2:" for file in $(find $1 -name "$3" -type f) # Alle Dateien, auf die das Muster passt, ermitteln do Dir=$(dirname $file)"/" # Verzeichnisname ermitteln, dirname gibt kein / am # Ende aus, wenn die Verzeichnisse mit / am Ende # angegeben werden, wuerde die folgende Ersetzung # fehlschlagen, deswegen Anhaengen des / Dir=${Dir/$1/$2} # aus dem Quellpfad wird ein Zielpfad gemacht # ${VARIABLE/SUCHTEXT/ERSETZUNG} # mit dieser Syntax wird das erste Vorkommen von # SUCHTEXT in VARIABLE gegen ERSETZUNG getauscht if [ \! -d $Dir ] # wie oben, pruefen auf Existenz des Verzeichnisses then createDirs $Dir # und bei Bedarf anlegen (rekursiv) fi mv $file $Dir # Verschieben der Datei done IFS=$tmpIFS # und schließlich den IFS wieder zuruecksetzen |
Beispielaufruf¶
recmv /home/ich/musik/ /home/du/musik "*.mp3"
Eine weitere Möglichkeit¶
Die gleiche Aufgabe etwas kompakter.
Hinweis:
1) Das Skript gibt bei seiner Ausführung zu jedem Schritt Hinweise aus - wenn nicht gewünscht einfach die echo
-Zeilen weglassen. 2) Das Zielverzeichnis muss existieren
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #!/bin/bash # Dieses Skript kopiert alle mp3-Dateien eines Pfades in einen anderen Ordner. # Für die eigenen Bedürfnisse müssen die Pfade/Ordnernamen noch angepasst werden. IFS=" " DATEIEN=$(find ~/DEIN_VERZEICHNIS -name "*.mp3") # hier Pfad anpassen! (DEIN_VERZEICHNIS) for i in $DATEIEN; do if [ -e ~/ZIELVERZEICHNIS/$(basename $i) ]; then # hier Pfad anpassen! (ZIELVERZEICHNIS) echo "exisitiert schon: ${i##*/} ...suche weiter" else echo -e "\n${i##*/} fehlt noch, kopiere:" cp -v $i ~/ZIELVERZEICHNIS # hier Pfad anpassen! (ZIELVERZEICHNIS) echo -e "OK, weiter gehts..\n" fi done |
Beispielaufruf¶
Wenn das Skript z. B. mit dem Namen copymp3.sh gespeichert und ausführbar gemacht wurde [3], erfolgt der Aufruf so [1]:
./copymp3.sh