.md
すべてのさまざまな名前のファイルでいっぱいのディレクトリがあるとしましょう。各ファイル名の前に「テキスト」を追加したいとしましょう。だから、例えば:ファイルa.md
、b.md
、とc.md
なるtest - a.md
、test - b.md
とtest - c.md
。
コマンドラインでこれをどのように達成しますか?
.md
すべてのさまざまな名前のファイルでいっぱいのディレクトリがあるとしましょう。各ファイル名の前に「テキスト」を追加したいとしましょう。だから、例えば:ファイルa.md
、b.md
、とc.md
なるtest - a.md
、test - b.md
とtest - c.md
。
コマンドラインでこれをどのように達成しますか?
回答:
ターミナルから簡単に直接入力できるワンライナー:
for f in *.md; do mv "$f" "test - $f"; done
または、セミコロンを使用する代わりに別の行に書き換えます:
for f in *.md
do
mv "$f" "test - $f"
done
for
(in sh
)の構文:
for NAME [in WORDS ... ] ; do COMMANDS; done
ここで、NAME
is f
とour WORDS
は、現在のディレクトリにあるすべてのファイルに一致し*.md
ます。そのため、変数$f
は、一致する各ファイルに置き換えられます*.md
。
だからa.md
:
mv "$f" "test - $f"
になる
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
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はファイル名のみを出力します-名前変更操作を中断させるパスコンポーネントなし。
bashで、フォルダー内のすべてのファイルに「テキストの追加-」を追加します。
for i in *; do mv "$i" "$(echo $i | sed 's/^/Prepend\ text\ \-\ /')"; done;
for i in *; do mv "$i$" "Prepend text - $i"; done