次のコマンドにどのような問題があるか教えてください。
find /tmp/dir -name "* *" -type f | rename 's/*/fixed_/g'
注 - 私はループ構文ではなくコマンドを使用してこれを行うことを好みます。
私が望むのは、名前を追加して/tmp/dirの下のすべてのファイル名を変更することです安定_各ファイルの前に
たとえば(ファイル)
Fevc.txt
Ddve.txt
次に、名前を変更する必要があります。
fixed_Fevc.txt
fixed_Ddve.txt
答え1
一時的な注意:問題があります。名前変更モードはパスを含むファイル名を処理しません。修正作業中です。
コマンドには2つのエラーがあります。
find /tmp/dir -name "* *" -type f | rename 's/*/fixed_/g'
スペースを含むファイル名のみを一致させます
-name "* *"
。これは欲しいものではありません。そうですか?- 解決策はこれを除外することです。特定の名前に一致するファイルを除外したくありません。すべてのファイルが欲しい。
この
rename
モデルは2つの点で間違っています。- Shell globパターンを使用しましたが、正規表現、つまり正規表現である必要があります(一部の一般的なPerl式である可能性があります。無視して使用します
s///g
)。 - 固定パターンはフルネームに合わせて置き換えられます
fixed_
。技術的には「最初の0文字」をに「変更したい」fixed_
。これと一致する行の先頭です^
。g
1行に1回しか交換できないので省略できます。
- Shell globパターンを使用しましたが、正規表現、つまり正規表現である必要があります(一部の一般的なPerl式である可能性があります。無視して使用します
すべてをまとめると次のようになります。
find /tmp/dir -type f | rename 's/^/fixed_/'
答え2
答え3
zshソリューションに興味がある人なら
cd /tmp/dir
for f (*(.)) mv $f fixed_$f
ここで (.) はファイルのみを意味します。
より簡単な場合
for f (*.txt) mv $f fixed_$f