web-dev-qa-db-ja.com

すべてのファイルをサブディレクトリから現在のディレクトリに移動しますか?

すべてのサブディレクトリに含まれているファイルを現在のディレクトリに移動し、空のサブディレクトリを削除するにはどうすればよいですか?

私は この質問 を見つけましたが、答えを次のように適応させました:

mv * .

動作しませんでした;次のような警告が多数表示されました。

mv: wil and ./wil are identical

サブディレクトリに含まれるファイルには、一意の名前があります。

13
Richard

-mindepthオプションを使用することもできます。

find . -type f -mindepth 2 -exec mv -i -- {} . \;

-maxdepthと一緒に、ファイルを収集する階層レベルを制限することもできます。)

私はmv -i(「インタラクティブ」)を使用して、ファイルを上書きする前にmvに確認を求めました。多くのサブディレクトリがあるため、警告が必要な名前の衝突が発生する可能性があります。

--オプションはオプションの処理を停止するため、ハイフンで始まるファイル名によってmvが混乱することはありません。

空のサブディレクトリの束全体をクリーンアップします

find . -depth -mindepth 1 -type d -empty -exec rmdir {} \;
22
Florian Jenn

これを試して:

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 %

5
trurl

バッシュ4:

shopt -s globstar
for file in **; do [[ -f "$file" ]] && mv "$file" .; done
0
ata