3 Stimmen

Regex suchen und kopieren in Bash (Ordnerstruktur beibehalten)?

Ich habe einen Ordner mit einer Reihe von Protokolldateien. Jeder Satz von Protokolldateien befindet sich in einem Ordner, in dem die Uhrzeit und das Datum angegeben sind, an dem das Programm ausgeführt wurde. In diesen Protokollordnern habe ich einige Videodateien, die ich extrahieren möchte. Ich will nur die Videodateien, sonst nichts. Ich habe versucht, mit diesem Befehl nur die Videodateien zu kopieren, aber es hat nicht funktioniert, weil ein Verzeichnis nicht existiert.

.rmv ist die Dateierweiterung der gewünschten Dateien.

$ find . -regex ".*\.rmv" -type f -exec cp '{}' /copy/to/here/'{}'

Wenn ich eine Ordnerstruktur wie folgt habe:

|--root  
   |  
   |--folder1  
   |  |  
   |  |--file.rmv  
   |  
   |--folder2  
      |  
      |--file2.rmv  

Wie kann ich es dazu bringen, nach copy/to/here zu kopieren, wobei es die Struktur von folder1 und folder2 im Zielverzeichnis kopiert?

12voto

K7g Punkte 121

Cp hat das Argument --parents Der kürzeste Weg zu dem, was Sie wollen, ist also:

find root -name '*.rmv' -type f -exec cp --parents "{}" /copy/to/here \;

2voto

Dennis Williamson Punkte 322329

Ich würde einfach die rsync .

1voto

martin clayton Punkte 74309

En {} steht für den vollständigen Pfad der gefundenen Datei, so dass Ihr cp Kommando auf diese Art von Dingen auswerten:

cp /root/folder1/file.rmv /copy/to/here/root/folder1/file.rmv

Wenn Sie nur die zweite {} wird es stattdessen sein

cp /root/folder1/file.rmv /copy/to/here

die copy-file-to-directory-Form von cp, die den Zweck erfüllen sollte.

Außerdem wird anstelle von -regex können Sie einfach die -name Operand:

find root -name '*.rmv' -type f -exec cp {} /copy/to/here \;

0voto

Angenommen, src ist Ihr root y dst ist Ihr /copy/to/here

#!/bin/sh

find . -name *.rmv | while read f
do
       path=$(dirname "$f" | sed -re 's/src(\/)?/dst\1/')
       echo "$f -> $path"
       mkdir -p "$path"
       cp "$f" "$path"
done

dies einfügen cp.sh und Laufen ./cp.sh aus dem Verzeichnis über Root

Ausgabe:

./src/folder1/file.rmv -> ./dst/folder1
./src/My File.rmv -> ./dst
./src/folder2/file2.rmv -> ./dst/folder2

EDIT: verbesserte Skriptversion (danke für den Kommentar)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X