[[Vorlage(getestet, general)]] {{{#!vorlage Wissen [:Terminal: Einen Terminal öffnen] }}} [[Inhaltsverzeichnis(3)]] 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 [topic:geloest-kopieren-nur-von-bestimmten-dateitype:diesem Thread]. = Quellcode = {{{#!code bash #!/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 = {{{#!code bash #!/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 == {{{#!vorlage Befehl recmv /home/ich/musik/ /home/du/musik "*.mp3" }}} = Eine weitere Möglichkeit = Die gleiche Aufgabe etwas kompakter. {{{#!vorlage 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 }}} {{{#!code bash #!/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]: {{{#!vorlage Befehl ./copymp3.sh }}} # tag: Programmierung