すべてのファイルをサブフォルダーから親フォルダーに移動するシェルスクリプト


48

folderにたくさんのフォルダーがありますA。これらすべてのフォルダーからファイルをに移動したいA

または

すべてのファイルを子フォルダーから切り取り、親フォルダーに貼り付けます。

どうやってするか?


1
私は実際にこれを絶対確実なものなどとテストしていませんが、ターミナルのフォルダAからこのコマンドを入力してみました mv */* .か?
マーティフライド

重複するファイル名はありませんか?
ジッピー

mv */* .サブフォルダーのサブフォルダーからファイルを移動しません。
ラーフルヴィルパラ

@jippieうん、重複する名前はありません
ラーフルヴィルパラ

回答:


82

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

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

つまり、「このディレクトリとそのサブディレクトリ内のすべてのファイルを検索し、ターゲットディレクトリでmvを実行します。見つかったファイルごとに、それらを現在のディレクトリに移動します。


1
また、既に親ディレクトリにあるファイルを移動しようとします。
ラーフルヴィルパラ

virpara:これで、エディションは.dotディレクトリ内のすべてのファイルを忘れます。警告を抑制するために、代わりに-mindepth 2で修正しました。
ツミノイド

1
GNUではfind、あなたはもう少しエレガントでない産卵することができmv、各ファイルのためのプロセス:find A -mindepth 2 -type f -exec mv -t A \{\} +
デビッド・フェルスター

デビッド、あなたのバージョンはコマンドラインの最大長に達するまで動作しますが、これは特に例のようにA以外のディレクトリから呼び出す場合、findがパスを出力する方法を考えると難しくありません。
ツミノイド14

9
これは非常に危険です。異なるサブフォルダーに同じファイル名のファイルがある場合、これらすべてを最後の検索で上書きします。--backup = numberedでmvを使用することをお勧めします:find . -mindepth 2 -type f -print -exec mv --backup=numbered {} . \;
pLumo

4

たとえば、ファイルを作成し、「cutme」という名前を付けることができます(ターミナルタイプでcutmeというファイルを作成するには、nano cutmeCTRL + Xを押してからENTERを押します)。

  1. これを再帰的に実行したい(サブフォルダーおよびそれらのサブフォルダーのサブフォルダーで)
  2. スクリプトファイルの移動をスキップしたい
  3. そのフォルダー内のファイルを移動する権限があります
  4. ファイルの名前にスペースが含まれている場合と含まれていない場合があります

find * -type f -print -not -type d -and -not -regex 'cutme' -exec mv {} .. \;

行内の名前cutmeに注意してください。実行するスクリプトと同じでなければなりません。

ファイルを作成して上記の行を貼り付けた後、スクリプトと同じフォルダーで次を実行します。

chmod +x cutme。これにより、新しいファイルに「実行可能」フラグが付与されるため、次のように実行できます./cutme


既に親ディレクトリにあるファイルを移動しようとするのはなぜですか?
ラーフルヴィルパラ

フォルダー内からスクリプトを実行します。その中のすべてのファイルは、サブフォルダー内にあるかどうかにかかわらず、フォルダーの親フォルダーに移動します。ここでの親フォルダーは、スクリプトの場所に関連する親です。実際、最後の2つのドットを変更することにより、スクリプトを実行するフォルダー内のすべてのファイルをどこに移動するかを指示できます。
ルイスアルバラード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.