web-dev-qa-db-ja.com

ファイル名にテキストを大量に追加する方法は?

さまざまな名前の.mdファイルでいっぱいのディレクトリがあるとします。各ファイル名の前に「テキスト」を付加したいとしましょう。したがって、たとえば、ファイルa.mdb.md、およびc.mdは、test - a.mdtest - b.md、およびtest - c.mdになります。

コマンドラインでこれをどのように達成しますか?

45
Jesse Atkinson

端末から直接簡単に入力できるワンライナー:

for f in *.md; do mv "$f" "test - $f"; done

またはセミコロンを使用する代わりに別の行に書き直します:

for f in *.md
do
    mv "$f" "test - $f"
done

博覧会

forの構文(sh内):

for NAME [in WORDS ... ] ; do COMMANDS; done

ここで、NAMEfで、WORDS*.mdに一致する現在のディレクトリ内のすべてのファイルです。したがって、変数$fは、*.mdに一致する各ファイルで置き換えられます。

a.mdの場合:

mv "$f" "test - $f"

なる

mv "a.md" "test - a.md"

各ファイル名$fにはスペースが含まれる場合があるため、引用符は重要です。そうでない場合、mvは各Wordが個別のファイルであると考えます。たとえば、引用符がなく、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
63
QuasarDonkey

prenameがある場合...

prename 's/^/test - /' *.md

通常のシェルコマンドの使用:

for file in *.md; do
    mv "$file" "test - $file"
done
11
user1686

mmv12 も、現在のジョブに適用される、このようなタスクに最適なツールです。

mmv '*.md' 'test - #1.md'

もちろん、「test-」をa.md、b.md、c.mdにのみ追加し、a1.mdには追加しない場合は、次のようにします。

mmv '?.md' 'test - #1.md'

より適切でしょう。

特にあなたがそのような問題をたくさん抱えているなら、私は本当にそれを提案することができます。

さらにグラフィカルインターフェイスを探している場合は、 gprename を試してください。

5
Claudius

IFS変数を再定義しない限りスペースで失敗するforループを使用する代わりに、whileループをfindと組み合わせて使用​​することをお勧めします。ファイルと同じディレクトリから実行すると、以下が機能します

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

私はそれが本当に遅いことを知っていますが、誰かがこのようなものを探しているなら、これは私にとってうまくいきました:

rename '' 'name -' *.md
2
nullptr

zshがある場合は、zmvを使用できます。

autoload zmv
zmv -w '*' 'test - $1'

次のコマンドでコマンドをテストできます。

zmv -wn '*' 'test - $1'
  • -nはドライランを意味します。つまり、何が起こるかを示すだけです。
  • -wは暗黙的にワイルドカードを括弧で囲み、後方参照を機能させます。
0
Thor

Bashで、フォルダ内のすべてのファイルに「先頭にテキストを追加」を追加します。

for i in *; do mv "$i" "$(echo $i | sed 's/^/Prepend\ text\ \-\ /')"; done;
0
Osiris