34

次のコマンドがあります。

find . -type d -mtime 0 -exec mv {} /path/to/target-dir \;

これにより、作成されたディレクトリが別のディレクトリに移動されます。xargs同じことをする代わりに、どのように使用できますかexec

4

5 に答える 5

42

BSD xargs ( OS Xおよび FreeBSD 用) では、この-Jためにビルドされたものを使用できます。

find . -name some_pattern -print0 | xargs -0 -J % mv % target_location

それは一致するものをすべてに移動some_pattern.ますtarget_location

GNU xargs ( Linuxおよび Cygwin 用) では、代わりに次を使用します-I

find . -name some_pattern -print0 | xargs -0 -I % mv % target_location

-iGNU xargsの廃止されたオプションは-I{}、次のように暗示され、使用できます。

find . -name some_pattern -print0 | xargs -0 -i mv {} target_location

BSD xargs にも-Iオプションがありますが、それは別のことを行うことに注意してください。

于 2013-07-20T16:53:02.783 に答える
40

GNU mv(およびfindand xargs) を持っている場合は、-tオプション to mv(and -print0for findand -0for xargs)を使用できます。

find . -type d -mtime -0 -print0 | xargs -0 mv -t /path/to/target-dir

の最新バージョンfind(POSIX 2008 と互換性がある)+は の代わりにサポートされ、使用しない場合;とほぼ同じように動作することに注意してください。xargsxargs

find . -type d -mtime -0 -exec mv -t /path/to/target-dir {} +

これにより、find便利な数のファイル (ディレクトリ) 名をプログラムの 1 回の呼び出しにグループ化できます。mvその提供に渡される引数の数を制御するレベルはありxargsませんが、とにかくそれが実際に必要になることはめったにありません。-tこれはまだGNU へのオプションにかかっていますmv

于 2012-12-16T08:42:07.810 に答える
4
find ./ -maxdepth 1 -name "some-dir" -type d -print0 | xargs -0r mv -t x/

find : オプションを指定-print0すると、出力は '\0' で終わります。

xargs : option-0を指定すると、args は '\0' で分割されますが、空白-rは no-run-if-empty を意味するfindため、出力が得られなかった場合でもエラーは発生しません。(-rは GNU 拡張です。)

通常、対象ファイルが存在するかどうかわからない場合に、スクリプトでこれを使用します。

于 2014-03-13T09:19:10.317 に答える
2

findこれには本当に良いツールではありません。すべてのサブディレクトリを別のディレクトリに移動したいと思います。findのようなものを出力します

./a
./a/b
./a/b/c
./a/b/c/d

最初に移動した後./a、すべてのサブディレクトリで「そのようなファイルまたはディレクトリはありません」というエラーが表示されます。

使用する必要がありますmv */ /another/place-- ワイルドカードの末尾のスラッシュは、展開をディレクトリのみに制限します。

于 2013-07-20T02:23:09.530 に答える
0

GNU mv を使用していない場合は、そのコマンドを使用できます。

find . -depth -type d -mtime 0 -exec bash -c 'declare -a array;j=1;for i; do array[$j]="$i"; j=$((j+1));done; mv "${array[*]}" /path/to/target-dir' arg0 {} +

それ以外の場合は、xargs を必要としないより簡単なソリューションを次に示します。

find . -depth -type d -mtime 0 -exec mv -t /path/to/target-dir {} +

-depth を追加したことに注意してください。そうしないと、ディレクトリとそのサブディレクトリの 1 つを処理するときにエラーが発生します。

于 2012-12-16T09:37:56.343 に答える