すべての.html
ファイルをmyDir
とそのサブディレクトリから~/otherDir
にコピーしたいと思います。これが私が試したものですが、機能しません:
$ 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
find myDir -name '*.html' -print0 | xargs -0 -J % cp % ~/otherdir
まず第一に、シェルはあなたのために「*」をグロブしています。 \
でエスケープするか、*.html
を引用符で囲みます
そのようです:
find myDir -name "*.html"
またはfind myDir -name \*.html
xargs
の-exec
スイッチでのfind
の使用をスキップします。
find myDir -name "*.html" -exec cp {} ~/otherDir \;
これが機能するのは、{}
がfind
で見つかったファイルの代わりになり、一致するたびに1回実行されるためです。
また、これによりソースディレクトリのコピーがフラット化されることに注意してください。例:
myDir/a.html
myDir/b/c.html
譲ります
otherdir/a.html
otherdir/c.html
それで、いくつかのソースディレクトリとそのサブディレクトリにあるすべての.html
ファイルを、すべて1つのディレクトリにコピーする(つまり、階層を折りたたむ)ようにしますか?
find myDir -name '*.html' -type f -exec sh -c 'cp "$@" "$0"' ~/otherDir {} +
~/otherDir
が中間シェルのパラメーター0になることに注意してください。これにより、ソースファイルを正確に"$@"
にすることができます。ターゲットディレクトリをシェルの外に残すことには、それが親シェルスクリプト(-exec sh -c 'cp "$@" "$0"' "$target"
)の変数である場合に、引用の問題に遭遇しないという追加の利点があります。
find … -exec … +
がない古いシステムの場合:
find myDir -name '*.html' -type f -exec cp {} ~/otherDir \;
私はあなたのシェルがbash≥4またはzshです:
shopt -s globstar # only for bash, put it in your `.bashrc`
cp myDir/**/*.html ~/otherDir/
OSXは-execdirをサポートしていますか?
find ./myDir -name "*.html" -execdir cp {} /abspath/to/otherDir ";"
Gnu/findは、ほとんどの場合、-execの代わりに-execdirを使用することを提案しています。
試してみてください
find myDir -name '*.html' -exec cp -t ~/otherdir {} +
このアプローチの問題の1つは、サブディレクトリが作成されないため、すべてのファイルが~/otherDir
に配置され、同じ名前であるがmyDir
ツリーの異なる部分にあるファイルがコピーされないことです。 。
これにより問題が発生する場合は、以下を使用して、~/otherDir
ツリー内に同じディレクトリツリーを作成できます。
find myDir -name '*.html' | cpio -pdm ~/otherdir
私はマックを持っていません
find myDir -name '*.html' -print | xargs -I {} cp {} ~/otherDir
またはあなたができるなら
find myDir -name '*.html' -print0 | xargs -0 -I {} cp {} ~/otherDir
これは、名前にスペースが含まれるファイルに対して安全であるためです。
ls myDir/*.html | xargs -I {} cp {} ~/otherDir