名前に文字と数字のjpgファイルがたくさんあります。すべての文字を削除したいとします。たとえば、abc12d34efg.jpg
は1234.jpg
になります。 forループについては、私は考えました:シェルからファイル名を削除して名前を変更する
for i in *.jpg; do mv "$i" ...
しかし、私は何のためのコマンドを見つけることができません。ここで
名前に文字と数字のjpgファイルがたくさんあります。すべての文字を削除したいとします。たとえば、abc12d34efg.jpg
は1234.jpg
になります。 forループについては、私は考えました:シェルからファイル名を削除して名前を変更する
for i in *.jpg; do mv "$i" ...
しかし、私は何のためのコマンドを見つけることができません。ここで
は、いくつかは、それがここで
としてfor f in *.jpg ; do
n="$(echo ${f} | tr -d a-zA-Z)"
mv "$f" "${n}jpg"
done
ようになり、フォーマットでtr
for f in *.jpg ; do n="$(echo ${f} | tr -d a-zA-Z)" ; mv "$f" "${n}jpg" ; done
を使用するとしてonelineソリューションは、何が起こっているかです。
まず、からすべての文字を削除名前はtr -d a-zA-Z
です。 abc12d34efg.jpg
からは1234.
(末尾にドットがあり、.
はa-z
とA-Z
間隔に属していないため)、この値を変数$n
に割り当てます。 T
$f
から${n}jpg
に名前を変更できます。それでおしまい。小文字と大文字の両方を削除する
更新は、文字ではなく、tr -d a-z
を使用だけ小文字を削除するために、tr -d a-zA-Z
を使用します。シェルパラメータの拡大に伴い
ありがとうございます!それは動作しますが、私は大文字の別のcicleを実行しなければならなかった、とにかく非常に良い説明! – druido82
@ druido82ようこそスタックオーバーフロー。答えがあなたの問題を解決した場合は、答えの横にあるチェックマークをチェックすることでそれを受け入れることができます。 –
:
for fname in *.jpg; do mv "$fname" "${fname//[[:alpha:]]}jpg"; done
"${fname//[[:alpha:]]}"
は何もない[[:alpha:]]
(任意の文字)のすべての出現の置換です。これによってもjpg
が削除されるため、再度追加する必要があります。–には、jpg
が追加されます。
sedを使用すると、すべての文字を正規表現を使用せずに置き換えることができます。
for i in *.jpg; do mv $i `echo $i | sed -e 's/[a-zA-Z]//g'`jpg; done
ファイル名にスペースが含まれていると失敗します。 –
ビットが不足していますが便利です:データ損失のリスクなしに目的に合ったコマンドmmvがあります。 – linuxfan