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


13

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

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

mv * .

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

mv: wil and ./wil are identical

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

回答:


22

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

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

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

私はファイルを上書きする前にmv -i(「インタラクティブ」)を使用してmv質問しました。サブディレクトリがたくさんあるので、警告したい名前の衝突があるかもしれません。

--オプションは、オプションの処理を停止するため、mvハイフンで始まるファイル名に惑わされません。

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

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

ファイルを上書きしないことでファイルを上書きするための質問をスキップする方法もありますか?
Filnor

2
mv:のオプション:-n, --no-clobber既存のファイルを上書きしません。あなたも興味があるかもしれませ-b, --backupん。
Florian Jenn

5

これを試して:

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

これで-print0xargs実行するステートメントのリストを作成しています。-J %フラグ手段は、ここではリスト要素を挿入し、そのmv $FILE .検出されたすべてのファイルに対して実行されます。

上記はBSD xargsで動作します。GNUバージョン(Linux)を使用している場合-I %は、-J %


0

バッシュ4:

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

-2

1つの簡単なトリックは、ファイルに拡張子(ドット付き)がある場合にのみ機能します。

mv *.* subdir/
mv .* subdir/

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.