Bestimmte Dateien aus Verzeichnisbaum in ein einzelnes Verzeichnis kopieren

Liebe/-r Experte/-in,
habe gerade eine Datenrettung vom PC meiner Tochter gemacht.

Jetzt habe ich unzählige Verzeichnisse, in denen ich Doks, MP3s, JPGs und viele andere nicht benötigte Dateien habe.

Da ich nicht so firm in der Shell-Programmierung bin, suche ich auf diesem Wege ein Skript, welches mir Dateien eines bestimmten Dateityps z. Bsp. *.jpg aus allen Unterverzeichnissen extrahiert und in eine Zielverzeichniss z. Bsp. /tmp/jpg schreibt. Es sollen dabei in dem Zielverzeichniss keine Unterverzeichnisse entstehen.

Ich hab schon einiges ausprobiert. Aber immer wurden wieder Unterverzeichnisse mit dem Source-Verzeichnisnamen angelegt.

Ich würde mich freuen, wenn mir jemand unter die Arme greifen könnte.

Vielen Dank schon mal.

VG

Klaus

Hallo Klaus,

Du schreibst leider nicht, welches Betriebssystem es genau ist, wo das laufen soll. Ich gehe mal davon aus, es ist ein Linux. Für die anderen Unixe ist folgende Lösung aber auch brauchbar:

  • wechsle zunächst in das oberste Verzeichnis, wo Deine zu kopierenden Dateien liegen (z. B. /home)
  • tippe dann folgende Zeile ein:

find . -name „*.jpg“ -exec cp {} /tmp/jpg ;

  • beachte dabei genau die Leerzeichen und Anführungszeichen
  • für andere Dateitypen ersetzt Du einfach „jpg“ (vor dem „-exec“ durch die entsprechende Endung
  • das Zielverzeichnis kannst Du natürlich ebenfalls ändern

Ich hoffe, das hilft!

Viele Grüße,

Thomas

Hallo Thomas,

zunächst vielen Dank für deine Antwort. Du hast richtig vermutet. Es handelt sich um ein Linux. Ein Opensuse!

Ich habe folgenden Befehl eingegeb:

find . -name „*.jpg“ -exec cp {} /tmp/jpg ;

Danach hate ich aber eine einzelne Datei jpg und kein Verzeichnis.

Was stimmt da nicht?

Kannst du mir noch mal helfen?

Danke.

Klaus

Hallo Klaus,

hatte ich doch vergessen … vorher muss das Zielverzeichnis angelegt sein, also in diesem Fall:

mkdir /tmp/jpg

und danach erst der find-Befehl. Sonst wird jede einzelne Datei nacheinander als Dateikopie /tmp/jpg angelegt - wie bei Dir geschehen.

Viele Grüße

Thomas

Hallo Thomas,

vielen Dank. Hat gefunzt, :smile:

VLG

Klaus

Hallo Klaus,

das geht in einer Zeile

cd ins Verzeichnis, wo Deine Quelldateien liegen.
Für die jpgs gehen wir mal davon aus, dass Du sie Nach /tmp/Bilder kopieren willst.

find . -name *.jpg -exec cp {} /tmp/Bilder ;

et voilà

Viele Grüße

Waldemar

Hallo Waldemar,

vielen Dank. Die Lösung funzt.

VG

Klaus

Hallo Klaus,

handelt es sich um ein **nix, z.B. Linux ?

Wenn ja habe ich ein kleines Script gebastelt (ohne viel Komfort), das vom aktuellen Verzeichnis aus alle Verzeichnisse durchsucht und alle Dateien mit dem anzugebenden Suffix (z.B. mp3 oder jpg *man achte auf Groß- und Kleinschreibung!)
in ein ebenfalls anzugebendes Ziel-Verzeichnis kopiert. Schon vorhandene Dateien mit gleichen Namen werden dabei überschrieben.

Mit
vi rec-copy
eine Datei anlegen und den nachfolgenden Inhalt per Copy & paste reinkopieren (ohne cut):

---- cut ----

!/bin/bash

DEST_DIR=$1
SUFFIX=$2

echo Destination: $DEST_DIR
echo Suffix to copy: *.$SUFFIX

declare -i COUNTER=0
declare -i FINISHED=0

function DirScan
{
DIRS= ls -ld \* | awk '{ if( $1 ~/^drwx/ ) { print $8 } }'

Subdirs in an array

for DIR in ${DIRS}
do
SPATH[COUNTER]=pwd/${DIR}

echo „SPATH ${COUNTER}: ${SPATH[COUNTER]}“
COUNTER=${COUNTER}+1
done
}

function DoScan
{
DirScan

while [${FINISHED} -lt ${COUNTER}]
do
cd ${SPATH[FINISHED]}
cp *.$SUFFIX $DEST_DIR
FINISHED=${FINISHED}+1

echo "Dir: pwd"

echo „Dirs passed: ${FINISHED} of ${COUNTER}“
DoScan
done
}

DoScan

---- cut ----

Danach ausführbar machen:

chmod 755 rec-copy

Dann kannst Du aus dem Verzeichnis der Datenrettung z.B. heraus das Script so aufrufen:

$HOME/rec-copy

also z.B. für alle jpg-Dateien:

$HOME/rec-copy $HOME/dateisammlung jpg

Ich hoffe, das hilft Dir.

Viele Grüße,

Udo

Hallo Udo,
vielen Dank für deine Zusendung. Bin momentan in Zagreb unterwegs und weiss noch nicht wann ich dazu komme deine Skripte auszuprobieren.

Habe inzwischen auch schon andere Zuschriften erhalten.

Also nochmals vielen Dank

VG

Klaus