これらの特定の要素を移動するには、どのコマンドを使用する必要がありますか?

これらの特定の要素を移動するには、どのコマンドを使用する必要がありますか?

これが私の初期の状況です。

たとえば、名前付きフォルダには、Father次の方法で保存されたいくつかのファイルがあります。 24のサブフォルダ(、、、...Fatherと呼びます)が含まれており、各サブフォルダには2つのファイルがあり、最初のサブフォルダには2つのフォルダと2つの最初のサブフォルダがあります。第二等。Child1Child2file1.avifile1.nfofile2.avifile2.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にそのまま渡されるように単一引用符を使用してください。findfind

ノート2:異なるディレクトリにあるが同じファイル名を持つファイル名が複数ある場合、このmvコマンドはそのファイルをすべて同じディレクトリに移動し、同じ名前のファイルが上書きされます。次のコマンドを使用してこれを回避できますmv -n(破壊モードなし)。

関連情報