
私のディレクトリには名前に文字を含む多くのファイルがあり、?
これらの文字を削除したいと思います?
。
助けてください?
答え1
rename 's/\?//g' *
すべてのファイルの名前を変更する人
francois@zaphod:~/tmp$ ls
toto_?_ toto_?_1 toto_?_2
francois@zaphod:~/tmp$ rename 's/\?//g' *
francois@zaphod:~/tmp$ ls
toto__ toto__1 toto__2
francois@zaphod:~/tmp$
答え2
あるいは、同様のシェルがbash
変数値のパターンに一致する文字列内のすべての項目を(または)に置き換える方法を知っているとします。${variable//pattern/replacement}
zsh
ksh
for name in ./*'?'*; do
mv -i "$name" "${name//'?'/}"
done
これは、現在のディレクトリ内の1つ以上の名前を含むすべての名前を繰り返す短いループです?
(隠された名前をスキップ)。これらの名前ごとに、?
ファイル名から文字が削除され、結果がファイルの新しいファイル名として使用されます。
パターンの一重引用符は、?
単一の文字に一致する特殊なワイルドカード文字で処理されるのを防ぎます(引用符がない場合があります?
)。\?
またはを使用することもできます[?]
。
出力に疑問符が表示されている場合は、ls
印刷できない文字を表す可能性があります。
削除するこれら'?'
、上記のコードの各項目をに置き換えます[![:print:]]
。ワイルドカードパターンは、[![:print:]]
印刷できない文字と一致します。文字[:print:]
クラスはと似ています[:graph:]
が、前者は空白文字と一致し、後者は一致しません。ユーザー[![:print:]]
会議いいえスペースを削除しながらスペースを削除します[![:graph:]]
。