次のコマンドがあります:
find . -type d -mtime 0 -exec mv {} /path/to/target-dir \;
これにより、設立されたディレクトリが別のディレクトリに移動します。 xargs
の代わりにexec
を使用して同じことを行うにはどうすればよいですか。
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
オプションに依存しています。
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
オプションもありますが、それは別のことを行うことに注意してください。
find ./ -maxdepth 1 -name "some-dir" -type d -print0 | xargs -0r mv -t x/
find:オプション-print0
、出力は「\ 0」で終了します。
xargs:オプション-0
、引数を '\ 0'で分割しますが、空白、-r
は空でない場合を意味するため、find
が出力を取得しなかった場合でもエラーは発生しません。 (-r
はGNU拡張機能です。)
ターゲットファイルが存在するかどうかわからない場合、通常、スクリプトでこれを使用します。
find
は実際にはこれに適したツールではありません。すべてのサブディレクトリを別のディレクトリに移動したいと思います。 find
は次のようなものを出力します
./a
./a/b
./a/b/c
./a/b/c/d
./a
が最初に移動された後、すべてのサブディレクトリで「そのようなファイルまたはディレクトリがありません」というエラーが表示されます。
mv */ /another/place
のみを使用する必要があります。ワイルドカードの末尾のスラッシュは、展開をdirsのみに制限します。
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つを処理するときにエラーが発生します。