ファイル名をzmvにパイプ

ファイル名をzmvにパイプ

複雑な正規表現パターンを開発するのではなく、パイプラインでfindを使用してからgrep -vを使用してファイルをフィルタリングする方がはるかに簡単です。しかし、次のようにzmvにパイプを接続すると:

find | grep -v TFLM | zmv "(*)" "TFLM \$1"

入力を無視し、引き続きすべてのファイルに変換を適用します。パイプ入力を使用するように指示する方法はありますか?フィルタリングされたファイルを移動してzmvを使用できるようですが、実際には解決策ではありません。

答え1

zmv標準入力からは読まないでください。

findwith heremvまたはzmvfilename glob を使用できますが、zshどちらも使用できず、grepまったく扱いません。grepファイル名(挿入された改行文字を含めることができます)ではなく、改行テキストを使用する必要があります。

ファイル名globの使用(現在のディレクトリでのみ機能し、非表示ではないファイルでのみ機能):

zmv '^TFLM *' 'TFLM $f'

次のように隠しファイルと隠しディレクトリのファイルを含むディレクトリの名前を変更せずに繰り返しますfind

zmv '(**/)(^TFLM *)(#qD^/)' '${1}TFLM $2'

使用してくださいfind(ただし、競合処理がないため、安全オプションzmvを追加してください-i):

find . ! -type d ! -name 'TFLM *' -exec sh -c '
    for pathname do
       mv -i "$pathname" "${pathname%/*}/TFLM ${pathname##*/}"
    done' sh {} +

場所bash(隠しファイルを除いて現在のディレクトリにのみ適用):

shopt -s extglob
for name in !(TFLM *); do
    mv -i -- "$name" "TFLM $name"
done

または、bashPerlrenameユーティリティを使用してください。

shopt -s extglob
rename 's|/|/TFLM |' ./!(TFLM *)

(そうでない場合は、./ファイル名がで始まると一部のバリエーションが失敗します-。すべてのバリアントが--タグオプションendをサポートしているわけではありません)。

答え2

それはあなたが働く方法ではなく、findあなたが働く方法grepですzmv。まずfind、ファイルを検索してからgrepパターンを検索することは意味がありません。このコマンドには、基本的になどのfindパターンマッチング機能が組み込まれています。必要に応じてを使用して正規表現の構文を変更することもできます。実行中の操作が高速ではないか、コマンドが多すぎるだけでなく、最悪の場合はコマンドにエラーが発生しやすいということです。ファイル内のスペース。GNU find-name-iname-path-regex-regextype

注意を払う限り、このソリューションは他のシステム間の移植性に非常にfind優れ-execています。mv

しかし、あなたがそれを使用しているので、zshすべての栄光を使用する必要があるので、-vnオプションを追加してzmv別のモードを試してみたいと思うかもしれません。

zmv -vn '(^(*TFLM*))' 'TFLM $1'

-v冗長で実行をブロック-nし、実行するジョブのみを印刷します(テストに役立ちます)。

答え3

grep私はあなたと同じように働き、最後までコマンドを階層化することを好みます。衝動を抑えるのは難しいですが、この場合はそうする必要があります。または、リストに対処したいときにプルを始めるfind | ...必要があることを精神的に覚えておく必要がありますxargs。このポイントに達したときに切り替える時間ですfind <regex> -exec ...

あなたのシナリオでここで使用することを検討できるパターンは次のとおりです。

$ find . ! -name "*TFLM*" -exec zmv "{}" "TFLM {}" \;

しかし、@StephaneChazelasのコメントによると、これはうまくいきません。

zmv は zsh 関数なので、find を介して直接実行することはできません。誰かがzmvの周りにスタンドアロンスクリプトラッパーを作成したとしても、-exec zmv "{}"と呼ぶことは言うまでもなく(zmvの目的を完全に崩す)、コマンド注入の脆弱性が発生する可能性があります。

したがって、このU&L Q&Aに示されている方法の1つを使用するより伝統的なオプションが残りました。バッチの名前変更ファイル

またはzmvそれ自体を使用して直接名前を変更します。今それを使用しているので、助けを求める必要さえまったくありzshません。zmvfind

$ zmv "(^*TFLM*)" "TFLM \$1"

メモ:私のアドバイスを少しでも受け入れてくださいzmvzsh私は実際にZshを使用せず、通常一日中Bashにいます。

引用する

関連情報