コマンドライン – ファイル名にテキストを大量に前置するには?

command-line sed terminal unix

.mdのファイルでいっぱいのディレクトリがあるとしましょう。それぞれのファイル名の前に “text “を付加したいとします。例えば、ファイル a.md, b.md, c.mdtest - 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

ここでは、NAMEfであり、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


mmv1,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


タイトルとURLをコピーしました