すべてのサブディレクトリに含まれているファイルを現在のディレクトリに移動し、空のサブディレクトリを削除するにはどうすればよいですか?
私は この質問 を見つけましたが、答えを次のように適応させました:
mv * .
動作しませんでした;次のような警告が多数表示されました。
mv: wil and ./wil are identical
サブディレクトリに含まれるファイルには、一意の名前があります。
-mindepth
オプションを使用することもできます。
find . -type f -mindepth 2 -exec mv -i -- {} . \;
(-maxdepth
と一緒に、ファイルを収集する階層レベルを制限することもできます。)
私はmv -i
(「インタラクティブ」)を使用して、ファイルを上書きする前にmv
に確認を求めました。多くのサブディレクトリがあるため、警告が必要な名前の衝突が発生する可能性があります。
--
オプションはオプションの処理を停止するため、ハイフンで始まるファイル名によってmv
が混乱することはありません。
空のサブディレクトリの束全体をクリーンアップします
find . -depth -mindepth 1 -type d -empty -exec rmdir {} \;
これを試して:
find ./*/* -type f -print0 | xargs -0 -J % mv % .
詳細情報:find-stamementを単独で試してください。移動するすべてのファイルのリストが表示されます(-print0
)。例:
probe:test trurl$ find ./*/* -type f
./test_s/test_s_s/testf4
./test_s/test_s_s/testf5
./test_s/testf1
./test_s/testf2
./test_s/testf3
./test_s2/testf6
./test_s2/testf7
-print0
およびxargs
これで、実行するステートメントのリストを作成しています。 -J %
フラグは、リスト要素をここに挿入することを意味するので、mv $FILE .
は、見つかったすべてのファイルに対して実行されます。
上記はBSD xargsで動作します。 GNUバージョン(Linux)を使用している場合は、-I %
の代わりに -J %
バッシュ4:
shopt -s globstar
for file in **; do [[ -f "$file" ]] && mv "$file" .; done