私はいくつかのディレクトリにたくさんの.Zipファイルを持っています:
Fol1/Fol2
Fol3
Fol4/Fol5
それらをすべて共通のベースフォルダーに移動するにはどうすればよいですか?
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 \;
bashバージョン4以降またはzshを使用している場合は、再帰的グロビングを使用することもできます。
mv **/*.Zip /path/to/move/Zip/files/to
これはファイルのみを移動し、相対パスは移動しないため、衝突が発生する可能性があります。
これは、バージョンに関係なくすべてのディストリビューションのほとんどをサポートする、データとエラーのない移動時に安全です。このコマンドはサブディレクトリをスキャンしてから、新しい宛先ディレクトリに移動またはコピーします。
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ファイルを表示します。
GNUバージョンのfindおよびmvがあるとすると、以下は既存の検索ベースの回答よりも効率的です。
find . -name '*.Zip' -exec mv --target-directory='/path/to/outputdir' '{}' +
を使って +
findの最後に-execは、見つかったファイルごとに1つのmvコマンドを実行するのではなく、ファイルのリストがmvコマンドに渡されることを意味します。ただし、これの制限は、コマンドの最後に '{}'しか配置できないことです。これにより、mv --target-directoryオプションを使用する必要があり、私が知る限り、これはGNU-ismです。
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
のコンテンツではなく、命名規則に依存している場合でも)。