Skripte/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:

  1. ⚓︎ Einen Terminal öffnen

Inhaltsverzeichnis
  1. Quellcode
  2. Version ohne rsync
    1. Beispielaufruf
  3. Eine weitere Möglichkeit
    1. Beispielaufruf

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