Linux: Befehl für jede kopierte Datei ausführen

332
goweon

Was ist der beste Weg, um Dateien an einen neuen Speicherort zu kopieren, während für jede kopierte Datei ein Befehl ausgeführt wird? Es wird erwartet, dass der / die kopierten Ordner Unterverzeichnisse haben.

Sie können beispielsweise cp -Reine Freigabe oder ein rsyncBackup durchführen und möchten:

  • Videos neu codieren: ffmpeg -i $source -c:v libx264 -crf 23 -c:a copy $destination
  • zur Archivierung komprimieren: gzip -9 $source
  • für den Transport verschlüsseln: gpg -e -r USER@example.com $source
  • Nur Kopfzeilen für die Vorschau kopieren: head -n 10 $source > $destination
  • oder sogar mehrere Befehle verketten
0

1 Antwort auf die Frage

0
Kamil Maciorowski

Der erste Schritt wäre das Kopieren der Verzeichnisstruktur:

sdir="/path/to/source/dir" tdir="/path/to/target/dir" cd "$sdir" find . -type d -exec mkdir -p "$tdir"/{} \; 

Möglicherweise möchten Sie mehr tun, z. B. Berechtigungen zum Kopieren:

find . -type d -exec chmod --reference={} "$tdir"/{} \; 

(Hinweis: --referencewird von POSIX nicht benötigt).

Oder anstelle von mkdirIhnen können Sie cp -a --attributes-only(auch Nicht-POSIX) verwenden:

# this assumes $tdir doesn't yet exist but its future parent does cp -a "$sdir" "$tdir" 

Entfernen Sie dann alle Nicht-Verzeichnisse aus $tdirund belassen Sie die leere Verzeichnisstruktur:

# make sure "$tdir" is what it should be find "$tdir" ! -type d -delete 

Wenn Sie nun über die Zielverzeichnisstruktur verfügen, arbeiten Sie mit den Dateien. Wenn Sie keine Pipes, Umleitungen usw. benötigen, können Sie mit diesem Beispiel vorgehen:

cd "$sdir" find . -type f -exec ffmpeg -i {} -c:v libx264 -crf 23 -c:a copy "$tdir"/{} \; # source ^^ target ^^^^^^^^^^ 

Wenn Sie Pipes oder Umleitungen benötigen, benötigen Sie eine Shell, um sie zu handhaben:

cd "$sdir" find . -type f -exec sh -c 'head -n 10 "$1" >"$2"/"$1"' sh-find {} "$tdir" \; # for sh these are $0:^^^^^^^, $1:^^, $2:^^^^^ 

Das Ausführen einer separaten Shell für jede Datei ist langsam, aber Sie können praktisch alles tun.