.md
のファイルでいっぱいのディレクトリがあるとしましょう。それぞれのファイル名の前に “text “を付加したいとします。例えば、ファイル a.md
, b.md
, c.md
は test - a.md
, test - b.md
, test - c.md
となります
コマンドラインを使って、どのようにしてこれを実現するのでしょうか?
48 None 2012-10-11
端末から簡単に直打ちできるワンライナー
for f in *.md; do mv "$f" "test - $f"; done
もしくは、セミコロンを使う代わりに別の行に書き換える
for f in *.md
do
mv "$f" "test - $f"
done
Exposition
for
の構文(sh
の場合)
for NAME [in WORDS ... ] ; do COMMANDS; done
ここでは、NAME
はf
であり、WORDS
は*.md
にマッチするカレントディレクトリ内のすべてのファイルです。したがって、変数 $f
は *.md
にマッチする各ファイルで置換されます
だからa.md
の場合
mv "$f" "test - $f"
becomes
mv "a.md" "test - a.md"
引用符は、各ファイル名 $f
にスペースが含まれている可能性があるので重要です。そうしないと、mv
はそれぞれの単語を別のファイルだと思ってしまいます。例えば、引用符がなく、Foo Bar.md
というファイルがある場合、次のように翻訳されます
mv Foo Bar.md test - Foo Bar.md
とすると、意図したようには動作しません。しかし、$f
を引用符で括ることで意味があります
mv "Foo Bar.md" "test - Foo Bar.md"
for
の構文に注意して、*.md
ファイルのサブセットの名前を変更することもできます
for f in a.md b.md d.md; do mv "$f" "Test - $f"; done
またはシェルの拡張を使用しています
for f in {a,b,d}.md; do mv "$f" "Test - $f"; done
67 QuasarDonkey 2012-10-11
prename
を持っていれば
prename 's/^/test - /' *.md
通常のシェルコマンドを使用します
for file in *.md; do
mv "$file" "test - $file"
done
11 user1686 2012-10-11
mmv
1,2はまた、現在の仕事に適用される、そのようなタスクのための非常に良いツールであるだろう
mmv '*.md' 'test - #1.md'
もちろん、a1.mdではなく、a.md、b.md、c.mdに “test – “だけを追加したい場合は、次のようにします
mmv '?.md' 'test - #1.md'
の方が適切でしょう
特にこのような悩みを多く抱えている方には、本当にお勧めできます
さらにグラフィカルなインターフェースを探している場合は、gprenameを試してみてください
6 Claudius 2012-10-11
IFS変数を再定義しない限りスペースで失敗するforループを使う代わりに、findと組み合わせたwhileループを使うことをお勧めします。以下は、ファイルと同じディレクトリから実行した場合に動作します
find . -maxdepth 1 -type f -name '*.md' | while read -r file; do
file=$(basename $file)
mv "$file" "test - $file"
done
basename” 行は find がファイル名のみを表示するようにするためのもので、リネーム操作を中断させるようなパス成分は含まれていません
5 Fred Clausen 2012-10-11
遅くなってしまいましたが、もし誰か他の人がこのようなものを探しているなら、これは私のために働いてくれました
rename '' 'name -' *.md
2 nullptr 2018-08-12
zsh
が空いていればzmv
を使うことができます
autoload zmv
zmv -w '*' 'test - $1'
コマンドでテストすることができます
zmv -wn '*' 'test - $1'
-n
はドライラン、つまり何が起こるかを示すだけという意味です-w
では、ワイルドカードの周りに括弧を暗黙のうちに入れ、後方参照を機能させています
0 Thor 2012-10-15
bashでは、フォルダ内のすべてのファイルに “プリペンドテキスト – “を追加します
for i in *; do mv "$i" "$(echo $i | sed 's/^/Prepend\ text\ \-\ /')"; done;
0 Osiris 2016-04-22