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良い考えではありません。試してはいけません。)

答え2

Ubuntuを使用しているので、GNUを見つけることができます。以下を試してください。

find . -maxdepth 1 ! -iregex ".*\.\(jpg\|png\|gif\|xcf\)$" -exec mv -- -t /path/to/newdir "{}" +
  • -iregex正規表現を使用してファイル名を見つけます。ただし、大文字と小文字を区別せず、!正規表現を無効にします。

  • -exec command +ファイル一致コマンドを実行します。find -print0で使用するのと同じですxargs -0。この機能を使用すると、1つのコマンドで見つかった複数のファイルを移動できるため、mv呼び出されたコマンドの合計数が一致するファイル数よりも少なくなります。

  • -maxdepth 1検索を現在のディレクトリのみに制限しfind、再帰的に使用するには削除してください。

答え3

あまりにも複雑にする必要はありません!なぜできないのですか:

mkdir ../temp
mv  *.{jpg,png,gif,xcf} ../temp/
mv * /desired/target/directory/
mv ../temp/* .
rmdir ../temp

もちろん、これはディレクトリツリー全体では機能せず、フラットファイルディレクトリでのみ機能します。

関連情報