Ich möchte alle .html
Dateien aus myDir
und ihre Unterverzeichnisse nach kopieren ~/otherDir
. Folgendes habe ich versucht, aber es funktioniert nicht:
$ find myDir -name *.html -print | xargs -0 cp ~/otherDir
usage: cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file target_file
cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file ... target_directory
Zuallererst ist die Shell das '*' für Sie. Entkomme es entweder mit
\
oder benutze Anführungszeichen*.html
Wie so:
find myDir -name "*.html"
oderfind myDir -name \*.html
Überspringen Sie die Verwendung von
xargs
mitfind
's-exec
Schalter:find myDir -name "*.html" -exec cp {} ~/otherDir \;
Dies funktioniert, weil es
{}
den Platz der gefundenen Datei einnimmtfind
und für jede Übereinstimmung einmal ausgeführt wird.Beachten Sie auch, dass dadurch die Kopie des Quellverzeichnisses reduziert wird. Beispiel:
wird nachgeben
quelle
mydir/a/a.html
undmydir/b/a.html
aufotherdir/a.html
und es ist nicht ganz offensichtlich vorhersehbar was man windet sich über letzte kopiert, das ist wahrscheinlich nicht etwas , was Sie wollen ...-exec cp {} ~/debug/ \;
nicht-exec cp ~/debug {} \;
aus den ziemlich offensichtlichen Gründen, wenn Sie darüber nachdenken ...Sie möchten also alle
.html
Dateien in einem Quellverzeichnis und seinen Unterverzeichnissen in ein einziges Verzeichnis kopieren (dh die Hierarchie reduzieren)?POSIX Standard:
Beachten Sie, dass dies
~/otherDir
Parameter 0 für die Zwischenshell wird, wodurch die Quelldateien präzise sein können"$@"
. Das Belassen des Zielverzeichnisses außerhalb der Shell hat den zusätzlichen Vorteil, dass keine Anführungszeichen auftreten, wenn dies eine Variable im übergeordneten Shell-Skript (-exec sh -c 'cp "$@" "$0"' "$target"
) ist.Für ältere Systeme, die nicht haben
find … -exec … +
:I Ihre Shell ist Bash ≥4 oder zsh:
quelle
shopt -s
(setopt
ist der entsprechende Befehl in zsh).-type f
ausgewertet-name "*.html"
? Während a.html ein gültiger Verzeichnisname ist, würde ich keinen erwarten. Vielleicht-type f
wäre es sinnvoller, bevor Sie den Dateinamen überprüfen, aber ich denke, es gibt selten einen Unterschied in der Ausführungsgeschwindigkeit.Versuchen
Ein Problem bei diesem Ansatz besteht darin, dass keine Unterverzeichnisse erstellt werden, sodass alle Dateien eingefügt werden
~/otherDir
und Dateien mit demselben Namen, aber in verschiedenen Teilen desmyDir
Baums nicht kopiert werden.Wenn dies zu einem Problem führen würde, können Sie Folgendes verwenden, um denselben Verzeichnisbaum innerhalb des
~/otherDir
Baums zu erstellenIch habe keinen Mac
oder wenn du kannst
Dies ist sicher für Dateien mit Leerzeichen im Namen.
quelle
Unterstützt OSX -execdir für find?
Gnu / find schlägt in den meisten Fällen vor, -execdir anstelle von -exec zu verwenden.
quelle
-execdir
ist besser für den Fall, dass ein Verzeichnis während desfind
Betriebs verschoben wird, aber leider nicht portierbar ist.quelle
myDir
, und in der Frage werden Dateien ausmyDir
und deren Unterverzeichnissen