すべてのファイルを1つのフォルダに移動する再帰スクリプトの作成[閉じる]

すべてのファイルを1つのフォルダに移動する再帰スクリプトの作成[閉じる]

この質問をたくさん受けたことがわかっています。まだそれらのいくつかは答えが得られずに残り、他のいくつかは私の質問に答えません。

次のディレクトリ階層を考えてみましょう。

たとえば、ディレクトリにはf1複数のディレクトリが含まれています。すべてのディレクトリとそのサブディレクトリのすべてのファイルを除いて、その親ディレクトリに移動するスクリプトを作成したいと思います。f1

それでは、例を見てみましょう。

f1ディレクトリにはfile1、file2、file3、...、filenファイルが含まれ、サブディレクトリsd1、sd2、sd3、...、sdnにはサブディレクトリが含まれています。

各サブディレクトリには、親ディレクトリと同じ名前のファイル、つまりfile1、file2 ...が含まれます。ただし、すべてのファイルの内容は異なります。操作が完了したら、これらのサブディレクトリ内のすべてのファイルを親ディレクトリに移動する必要があります。すべてのファイルが異なる「パス名」で終わるため、名前の競合が問題になるとは思いません。名前の競合のみが発生する場合は、ファイルをルートの親ディレクトリに移動できないため、ルートディレクトリに存在します。そこにroot元々存在していたファイルに単語を追加する必要があります。

いくつかの例示的なパス:

f1/sd1/sd1/file1
f1/sd1/file1
f1/file1

手術後、

f1/sd1/sd1/file1 -> f1/sd1/file
f1/sd1/file1     -> f1/file1
f1/file1         ->f1/file1_root

この問題を解決する方法はありますか?

答え1

findそして、以下を使用して各ファイルを上に移動できます-execdir

find f1 -mindepth 2 -type f -execdir mv -t ../ {} +

重複したファイル名が上書きされるため、mv -b既存のファイルのバックアップに使用することを検討してください。

  • -mindepth 2最低レベルのフォルダ(f1)は除外されます。
  • -execdir ... +見つかったファイルがあるフォルダーからコマンドが実行されます。

関連情報