複雑な正規表現パターンを開発するのではなく、パイプラインでfindを使用してからgrep -vを使用してファイルをフィルタリングする方がはるかに簡単です。しかし、次のようにzmvにパイプを接続すると:
find | grep -v TFLM | zmv "(*)" "TFLM \$1"
入力を無視し、引き続きすべてのファイルに変換を適用します。パイプ入力を使用するように指示する方法はありますか?フィルタリングされたファイルを移動してzmvを使用できるようですが、実際には解決策ではありません。
答え1
zmv
標準入力からは読まないでください。
find
with heremv
またはzmv
filename 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
または、bash
Perlrename
ユーティリティを使用してください。
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
ません。zmv
find
$ zmv "(^*TFLM*)" "TFLM \$1"
メモ:私のアドバイスを少しでも受け入れてくださいzmv
。zsh
私は実際にZshを使用せず、通常一日中Bashにいます。