Bash は、指定された拡張子と一致しないすべてのファイルをコピーします。

Bash は、指定された拡張子と一致しないすべてのファイルをコピーします。

Shotwellのカメラから写真をインポートすると、ビデオクリップもインポートされます。映像を別のフォルダに保存したいので、これはちょっと面倒ですね。私は成功せずにこれを行うためにbashコマンドを書いてみました。

次の要件を満たすコマンドが必要です。

  • .jpg、.png、.gif、または.xcf拡張子(大文字と小文字を区別しない)を含むディレクトリ構造内のすべてのファイルを見つけます。
  • ファイル名またはディレクトリパスにスペースや特殊文字が含まれているかどうかにかかわらず、これらすべてのファイルをターゲットディレクトリに移動します。

どんな助けでも大変感謝します!

編集:Ubuntuはデフォルトのシェルを使用しています。これは、一部のコマンドにエイリアスが割り当てられることを意味します。

編集2:私は自分で試しました(コピー部分ではなくファイルリスト部分のみ)。 extglobを開き、次のコマンドを実行します。

$ ls -R /path | awk '
  /:$/&&f{s=$0;f=0}
  /:$/&&!f{sub(/:$/,"");s=$0;f=1;next}
  NF&&f{ print s"/"$0 }'

ここにはすべてがリストされています。最後にgrepを使ってみましたが、私が与えたパターンと一致しないようにする方法がわかりません。 extglobスイッチはgrepにはあまり役に立ちませんが、他のコマンドには役立ちます。

ベストアンサー1

あなたはそれを使用することができますfind一部の特定のテストに一致する(または一致しない)ディレクトリツリー内のすべてのファイルを見つけて、そのファイルに対していくつかのタスクを実行します。この特定の問題には、次のものを使用できます。

find -type f ! \( -iname '*.png' -o -iname '*.gif' -o -iname '*.jpg' -o -iname '*.xcf' \) -exec echo mv {} /new/path \;

これにより、検索は通常のファイル(-type f)に制限され、!名前()に大文字と小文字の拡張子()または()がないファイルなどに制限されます。すべての拡張は単一の条件にグループ化されます。一致するファイルごとにファイルをディレクトリに移動するコマンド()を実行し、代わりにファイル名がディレクトリに挿入されます。コマンドが終了したことを示します。*.png-iname '*.png'-o*.gif\( ... \)-exec{}/new/path\;find

名前の置換はプログラム実行コード内で発生するため、スペースやその他の特殊文字は重要ではありません。


Bashでこれを行うには拡張パターンマッチング機能。これらもオンにshopt extglobする必要がありますglobstar。この場合は、以下を使用してください。

mv **/!(*.[gG][iI][fF]|*.[pP][nN][gG]|*.[xX][cC][fF]|*.[jJ][pP][gG]) /new/path

これは、大文字と小文字の組み合わせで、等が一致しないサブディレクトリ()内のすべてのファイルを一致させ、そのファイルを新しいパスに移動します**。拡張はシェルで行われるため、スペースと特殊文字はもはや重要ではありません。*.gif*.png

上記は、すべてのファイルがサブディレクトリにあると想定しています。そうでない場合は、以降のセクションを繰り返して**/現在のディレクトリを含めることができます。

同様の機能が利用可能zshそして他のシェルを使用していますが、Bashを使用しているとマークしました。


(追加の注意:解析は決してls良い考えではありません。試してはいけません。)

おすすめ記事