web-dev-qa-db-ja.com

すべてのHTMLファイルをディレクトリツリーから単一のディレクトリにコピーする方法

すべての.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
7
simpatico

find myDir -name '*.html' -print0 | xargs -0 -J % cp % ~/otherdir

3
Mel

まず第一に、シェルはあなたのために「*」をグロブしています。 \でエスケープするか、*.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
12
Miles Strombach

それで、いくつかのソースディレクトリとそのサブディレクトリにあるすべての.htmlファイルを、すべて1つのディレクトリにコピーする(つまり、階層を折りたたむ)ようにしますか?

[〜#〜] posix [〜#〜] 標準:

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を使用することを提案しています。

2
user unknown

試してみてください

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

これは、名前にスペースが含まれるファイルに対して安全であるためです。

2
user591
ls myDir/*.html | xargs -I {} cp {} ~/otherDir
0
hawkeye126