私の使命は、特別な名前を持つ複数のディレクトリのすべてのファイルをターゲットディレクトリにコピーすることです。
だから私はコマンドをテストするためにこのディレクトリを作成しました。テストディレクトリツリーは次のとおりです。
.
├── dir1
│ └── file1
└── test
mv dir1のすべてのファイルをテストするコマンドは次のとおりです。
find . -type d -name "*dir*" -exec mv {}/* test \;
それから私は次を得ます:
mv: rename ./dir1/* to test/*: No such file or directory
これは、コマンドが追加の-exec式で*をワイルドカード文字として扱わないためだと思います。
だから私はこれをしました:
find . -type d -name "*dir*" -exec mv {}/file1 test \;
テストのためにfile1を正常に移動しました。
ただし、要点は、このファイル転送操作を実行するには、すべてのファイルの式が必要であることです。
find -exec
この事実を指揮グループにどのように伝えますか?
答え1
mv "$dir_path"/* ...
"$dir_path"
ファイルだけでなく、名前が少なくとも点で始まらないすべてのファイル(隠しファイル)も移動されます。 Bashでは、optionsを使用してこの設定を変更できますdotglob
。ただし、*
うまく拡張した場合(すべてのものと一致するがコマンドラインと比較してあまり多くない場合)、シェル間接参照を使用できます。
find . -type d -name "*dir*" -exec bash -c 'mv "$0"/* /path/to/test' {} \;
答え2
努力する:
$ find -type d -name '*dir*' -exec sh -c '
for d do
for f in "$d"/*; do
[ -f "$f" ] && mv -- "$f" /path/to/test
done
done
' sh {} +
答え3
これを試してみることもできます。テストディレクトリが他のディレクトリと同じディレクトリにあることを考慮すると、
find . -mindepth 2 ! -name test -exec cp {} test \;
これにより、個々のファイルはすべてdir1、dir2などをエスケープしてtestディレクトリにコピーされます。これにより、サブディレクトリ自体が省略され、その内容がコピーされます。 lsコマンドを使用してこれをテストすることもできます。
find . -mindepth 2 ! -name test -ls