ファイル名を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をサポートしているわけではありません)。

おすすめ記事