ubuntuusers.de

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 

Diese Revision wurde am 25. Dezember 2011 20:01 von Heinrich_Schwietering erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Programmierung