複数のディレクトリに多数の.zipファイルがあります。
Fol1/Fol2
Fol3
Fol4/Fol5
それらをすべて共通の基本フォルダーに移動するにはどうすればよいですか?
複数のディレクトリに多数の.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 {} \;
find
上記の最初のコマンドはbashで機能していましたが、機能するようにfind . -name
etcに変更する必要がありました。
.
はGNU findには暗黙的ですが、他のユーザーにはそうではありません。明示的に追加しました。
これは、バージョンに関係なくすべてのディストリビューションのほとんどをサポートするデータおよびエラーのない移動時に安全です。このコマンドは、サブディレクトリをスキャンしてから、新しい宛先ディレクトリに移動またはコピーします。
find . -name *.flac -exec mv '{}' "./flac/" ";"
*.flac
ようなもの*.zip
に変更できる場所。または*.doc
、任意の拡張機能が機能します。mv
ファイルを移動するためのコマンドである、またはあなたが使用することができcp
、データをコピーする代わりに移動すること。./flac/
すべてのFLACファイルの移動先のディレクトリです。次のような完全なパスを指定することもできます/home/myid/flac/
完全な例。(この場合、音楽アーティスト名のサブディレクトリが多数/home/myid/Music/
あり、FLACファイルはすべて異なるサブディレクトリレベルにあります。アーティストフォルダは必要ないが、すべてのFLACファイルを1つのディレクトリに入れたい/home/myid/Music/flac/
cd /home/myid/Music
mkdir flac
find . -name *.flac -exec mv '{}' "./flac/" ";"
cd flac
ls
その後、すべてのFLACファイルが表示されます。
;
するの?
バッシュハックとして、次の機能を使用できます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
コンテンツの代わりに命名規則に依存していても)より効率的です。
findとmvのGNUバージョンを持っていると仮定すると、以下は既存の検索ベースの回答よりも効率的です。
find . -name '*.zip' -exec mv --target-directory='/path/to/outputdir' '{}' +
+
find -execの最後でa を使用すると、見つかったファイルごとに1つのmvコマンドを実行するのではなく、ファイルのリストがmvコマンドに渡されます。ただし、これの制限は、コマンドの最後に「{}」しか配置できないことです。これにより、mv --target-directoryオプションの使用が必要になります。