これが私の初期の状況です。
たとえば、名前付きフォルダには、Father
次の方法で保存されたいくつかのファイルがあります。 24のサブフォルダ(、、、...Father
と呼びます)が含まれており、各サブフォルダには2つのファイルがあり、最初のサブフォルダには2つのフォルダと2つの最初のサブフォルダがあります。第二等。Child1
Child2
file1.avi
file1.nfo
file2.avi
file2.nfo
私がやりたいことは、.avi
すべてのファイルをフォルダに入れることですFather
。他のファイルが欠落していることは気にしません。
これまでに試した最良の方法はaを使用することですが、cp -R ./*.avi .
フォルダからファイルを抽出せずに処理するのに時間がかかります。
どのように書くべきですか?
答え1
globは*
通常のファイルだけでなくディレクトリも一致させるために使用できるので、探しているコマンドは次のようになります。
mv ./*/*.avi .
答え2
find
このコマンドのオプションを使用できます-exec
。
cd Father
find Child1 Child2 ... -name '*.avi' -exec mv -n {} . +
コマンドは次のように分類されます。
find Child1 Child2 ...
Child1、Child2などの下のすべてのファイルとディレクトリが検索されます。基本的な作業は名前を印刷することです。-name '*.avi'
名前パターン "*.avi"に一致するファイル(またはディレクトリ)に結果を制限します。-exec mv {} . +
find
一致結果を印刷するのではなく、コマンドが実行されることを示します。{}
コマンドでfind
見つかったファイル名をどこに置くべきかを示し、+
実行するコマンドの終わりを示し、代わりにできるだけ多くのファイル名を入れなければならないことを示します。ファイル名ごとに1回コマンドを実行します。たとえば、次のようになります。mv -n Child1/as.avi Child1/many.avi Child1/matching.avi Child1/filenames.avi Child1/as.avi Child1/possible.avi .
コマンドがどんなものか見たいなら可能-exec echo mv
これを行うには、いつでも代わりに書くことができます。-exec mv
注1:コマンドに到達する前にシェルによってファイル名に拡張されず、-name '*.avi'
テキストがコマンド*.avi
にそのまま渡されるように単一引用符を使用してください。find
find
ノート2:異なるディレクトリにあるが同じファイル名を持つファイル名が複数ある場合、このmv
コマンドはそのファイルをすべて同じディレクトリに移動し、同じ名前のファイルが上書きされます。次のコマンドを使用してこれを回避できますmv -n
(破壊モードなし)。