web-dev-qa-db-ja.com

特定の拡張子を持つすべてのファイルを複数のサブディレクトリから1つのディレクトリに移動します

私はいくつかのディレクトリにたくさんの.Zipファイルを持っています:

Fol1/Fol2
Fol3
Fol4/Fol5

それらをすべて共通のベースフォルダーに移動するにはどうすればよいですか?

53
InquilineKea

Zipファイル(cd …)を含むツリーの最上位ディレクトリに移動し、実行します

mv **/*.Zip /path/to/single/target/directory/

これは、zshではそのまま使用できます。シェルがbashの場合は、最初にshopt -s globstarを実行する必要があります(このコマンドは~/.bashrcに含めることができ、また含める必要があります)。シェルがkshの場合は、最初にset -o globstarを実行する必要があります(~/.kshrcに入れます)。

または、findを使用します。これは、特別な準備なしでどこでも機能しますが、より複雑です。

find . -name '*.Zip' -exec mv {} /path/to/single/target/directory/ \;

後で空のディレクトリを削除する場合は、zshで次のようにします。

rmdir **/*(/^Fod)

Bashまたはkshの場合:

rmdir **/*/

削除する空のディレクトリがある限り繰り返します。または、任意のシェルで

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

移動するだけの場合は.Zipファイル、次のようなことができます

mkdir ./zipfiles
find . -name "*.Zip" -exec mv "{}" ./zipfiles \;
15
Bernhard

bashバージョン4以降またはzshを使用している場合は、再帰的グロビングを使用することもできます。

mv **/*.Zip /path/to/move/Zip/files/to

これはファイルのみを移動し、相対パスは移動しないため、衝突が発生する可能性があります。

3
SuperMagic

これは、バージョンに関係なくすべてのディストリビューションのほとんどをサポートする、データとエラーのない移動時に安全です。このコマンドはサブディレクトリをスキャンしてから、新しい宛先ディレクトリに移動またはコピーします。

find . -name *.flac -exec mv '{}' "./flac/" ";"
  • 移動するファイルを含むサブディレクトリを含むメインディレクトリでこのコマンドを実行します。
  • *.flac*.Zipのようなものに変更できる場所。または、*.docは、任意の拡張機能のみが機能します。
  • mvはファイルを移動するコマンドですが、移動する代わりにcpを使用してデータをコピーすることもできます。
  • ./flac/は、すべてのFLACファイルの移動先のディレクトリです。 /home/myid/flac/のような完全なパスを与えることもできます

完全な例。 (この場合、/home/myid/Music/に音楽アーティスト名のサブディレクトリが多数あり、FLACファイルはすべて異なるサブディレクトリレベルにあります。アーティストフォルダは必要ありませんが、すべてのFLACファイルを/home/myid/Music/flac/の1つのディレクトリに入れたいので

cd /home/myid/Music
mkdir flac
find . -name *.flac -exec mv '{}' "./flac/" ";"
cd flac
ls

次に、すべてのFLACファイルを表示します。

2
Seandex

GNUバージョンのfindおよびmvがあるとすると、以下は既存の検索ベースの回答よりも効率的です。

find . -name '*.Zip' -exec mv --target-directory='/path/to/outputdir' '{}' +

を使って + findの最後に-execは、見つかったファイルごとに1つのmvコマンドを実行するのではなく、ファイルのリストがmvコマンドに渡されることを意味します。ただし、これの制限は、コマンドの最後に '{}'しか配置できないことです。これにより、mv --target-directoryオプションを使用する必要があり、私が知る限り、これはGNU-ismです。

0
evilsoup

Bashハックとして、tarの機能を使用できます。

(cd Origin/;find . -exec file --mime-type "{}" \;|grep "application/Zip"|cut -d ':' -f 1|xargs tar cf -)|(cd target/; tar xf -) && rm -fr Origin/

これには、fileコマンドを使用して移動するファイルを選択し、ディレクトリ構造を保持するため、ファイル拡張子に依存しないという利点がありますが、スペースを含むパスでは機能しません。

最後のrmは、元のファイルを削除するためだけにあります(@InquilineKeaがコメント内の元のフォルダーを気にしないと言っているため)。

もちろん、これはOrigin /とtarget /フォルダーが異なるディスク上にある場合に特に適しています。それ以外の場合は、提案されている他のソリューションの方が効率的です(fileのコンテンツではなく、命名規則に依存している場合でも)。

0
Giacomo Tesio