コマンドライン(またはスクリプト)を使用してディレクトリ構造を削除する方法

コマンドライン(またはスクリプト)を使用してディレクトリ構造を削除する方法

私は多数のフォルダを持つ2段階のディレクトリ構造に多数のファイルを圧縮しました。

つまり、内部に多くのサブフォルダがあるフォルダがあります。これらのサブフォルダにはサブフォルダはありませんが、その中に何百ものファイルがあります。

私がやりたいことは、このサブフォルダ内のすべてのファイルをサブフォルダが保存されているディレクトリに移動することです。

これはリソースが限られたシステムなので、これらすべてのファイルの2つのコピーが同時に存在する必要がない場合は良いでしょう。

答え1

GNUツールの使用:

cd that-dir &&
  find . -mindepth 2 ! -type d -exec mv -it . {} +

答え2

親ディレクトリに移動して実行します。

mv -- */* .

--名前で始まるサブディレクトリがある場合にのみ必要です-

.(dotfile)で始まるサブディレクトリ、または次に始まる名前のサブディレクトリにファイルがある場合.

mv -- */* */.[!.]* */..?* .
mv -- .[!.]*/* .[!.]*/.[!.]* .[!.]*/..?* .
mv -- ..?*/* ..?*/.[!.]* ..?*/..?* .

競合がないことを確認してください。それ以外の場合は、最後に移動したファイルが以前に移動したのと同じ名前のファイルを自動的に上書きします。競合が発生した場合にメッセージを表示するには、オプションを(たとえば)-iに渡します。mvmv -i */* .

その後、サブディレクトリを削除できます。

rmdir */

コマンドラインが長すぎるというエラーメッセージが表示された場合は、いくつかの手順を実行する必要があります。最も簡単な方法は、find次のコマンドを使用することです。

find */ -type f -exec mv -i {} . \;

または少し速いです。

find */ -type f -exec sh -c 'mv -i -- "$@" "$0"' . {} +

非組み込みLinuxシステムでは、はるかに高速です。

find . -mindepth 2 -type f -exec mv -it . {} +

関連情報