さまざまな名前の.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
の構文(sh
内):
for NAME [in WORDS ... ] ; do COMMANDS; done
ここで、NAME
はf
で、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
prename
がある場合...
prename 's/^/test - /' *.md
通常のシェルコマンドの使用:
for file in *.md; do
mv "$file" "test - $file"
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はファイル名のみを出力します-名前の変更操作を中断させるパスコンポーネントはありません。
私はそれが本当に遅いことを知っていますが、誰かがこのようなものを探しているなら、これは私にとってうまくいきました:
rename '' 'name -' *.md
zsh
がある場合は、zmv
を使用できます。
autoload zmv
zmv -w '*' 'test - $1'
次のコマンドでコマンドをテストできます。
zmv -wn '*' 'test - $1'
-n
はドライランを意味します。つまり、何が起こるかを示すだけです。-w
は暗黙的にワイルドカードを括弧で囲み、後方参照を機能させます。Bashで、フォルダ内のすべてのファイルに「先頭にテキストを追加」を追加します。
for i in *; do mv "$i" "$(echo $i | sed 's/^/Prepend\ text\ \-\ /')"; done;