Ich versuche, einen Befehl auszuführen, der dem folgenden in einem Bash-Skript ähnlich ist. Es sollte alle Unterordner von durchsuchen $sourcedir
und alle Dateien eines bestimmten Typs in das Stammverzeichnis von kopieren $targetdir
.
#!/bin/bash
# These are set as arguments to the script, not hard-coded
sourcedir="/path/to/sourcedir"
targetdir="/path/to/targetdir"
find "$sourcedir" -type f -name "*.type" -exec sh -c 'cp "$1" "$2/`basename "$1"`"' "{}" "$targetdir" \;
Das scheint ziemlich nahe zu sein, außer , dass {}
nicht in so geführt wird , $2
um-exec sh -c ...
Ich möchte dies so nah wie möglich am "richtigen Weg" tun, mit Toleranz für Sonderzeichen in Dateinamen (insbesondere einfache Anführungszeichen).
Bearbeiten: Ich sehe Leute, die die Verwendung xargs
oder Verkettung von Argumenten vorschlagen . Ich hatte den Eindruck, dass dies nur für eine begrenzte Anzahl von Argumenten in Ordnung ist. Wenn ich zum Beispiel Tausende von JPG-Dateien habe, die ich aus einer Reihe von Galerieverzeichnissen in ein riesiges Diashow-Verzeichnis zu kopieren versuche, funktionieren die Argumente für die Verkettung von Lösungen dann immer noch?
Edit 2: Mein Problem war, dass mir eine _
vor meiner ersten Option fehlte, um in den -exec
Befehl zu wechseln . Für alle, die neugierig sind, wie der Befehl find funktioniert, fügen Sie den Befehl _
und alles wird gut:
find "$sourcedir" -type f -name "*.type" -exec sh -c 'cp "$1" "$2"' _ "{}" "$targetdir" \;
Ich habe die Antwort unten zwar akzeptiert, weil sie dieselbe Aufgabe erfüllt, aber effizienter und eleganter ist.
xargs
wurde jemals entwickelt, um große Mengen von Argumenten bei regulären Befehlen mit Einschränkungen automatisch zu verarbeiten. Zu beachten ist auch, dass die meisten der maximalen Argumentgrenzen für die Standard-GNU-Utils erheblich verbessert wurden. Sie werden auch einen Leistungsvorteil sehen, indem Sie alle diese Prozessgabeln vermeiden, die für Tausende von Dateien relevant sind.