次のコマンドがあります。
find . -type d -mtime 0 -exec mv {} /path/to/target-dir \;
これにより、作成されたディレクトリが別のディレクトリに移動されます。xargs
同じことをする代わりに、どのように使用できますかexec
。
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
-i
GNU xargsの廃止されたオプションは-I{}
、次のように暗示され、使用できます。
find . -name some_pattern -print0 | xargs -0 -i mv {} target_location
BSD xargs にも-I
オプションがありますが、それは別のことを行うことに注意してください。
GNU mv
(およびfind
and xargs
) を持っている場合は、-t
オプション to mv
(and -print0
for find
and -0
for xargs
)を使用できます。
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
便利な数のファイル (ディレクトリ) 名をプログラムの 1 回の呼び出しにグループ化できます。mv
その提供に渡される引数の数を制御するレベルはありxargs
ませんが、とにかくそれが実際に必要になることはめったにありません。-t
これはまだGNU へのオプションにかかっていますmv
。
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 拡張です。)
通常、対象ファイルが存在するかどうかわからない場合に、スクリプトでこれを使用します。
find
これには本当に良いツールではありません。すべてのサブディレクトリを別のディレクトリに移動したいと思います。find
のようなものを出力します
./a
./a/b
./a/b/c
./a/b/c/d
最初に移動した後./a
、すべてのサブディレクトリで「そのようなファイルまたはディレクトリはありません」というエラーが表示されます。
使用する必要がありますmv */ /another/place
-- ワイルドカードの末尾のスラッシュは、展開をディレクトリのみに制限します。
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 つを処理するときにエラーが発生します。