web-dev-qa-db-ja.com

xargsを使用して、検索結果から別のディレクトリにディレクトリを移動します

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

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

これにより、設立されたディレクトリが別のディレクトリに移動します。 xargsの代わりにexecを使用して同じことを行うにはどうすればよいですか。

32
zjhui

GNU mv (およびfindおよびxargs)がある場合、-tオプションを使用してmv(およびfindの場合は-print0およびxargsの場合は-0):

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

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

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

これにより、findが便利な数のファイル(ディレクトリ)名をプログラムの単一の呼び出しにグループ化します。 mvが提供するxargsに渡される引数の数を制御するレベルはありませんが、実際にはほとんど必要ありません。これは、まだGNU mv。]の-tオプションに依存しています。

39

BSD xargs (forOS XおよびFreeBSD)では、このために構築された-Jを使用できます。

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

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

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

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

非推奨のGNU xargsの-iオプションは-I{}を意味し、次のように使用できます。

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

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

39
user974202
find ./ -maxdepth 1 -name "some-dir" -type d -print0 | xargs -0r mv -t x/

find:オプション-print0、出力は「\ 0」で終了します。

xargs:オプション-0、引数を '\ 0'で分割しますが、空白、-rは空でない場合を意味するため、findが出力を取得しなかった場合でもエラーは発生しません。 (-rはGNU拡張機能です。)

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

3
Evans Y.

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

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

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

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

2
glenn jackman

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つを処理するときにエラーが発生します。

0
jlliagre