同様の質問がたくさん出ました。その虫がおそらく私の顔を狙っているのに、私はただ見ることができない…。
#!/bin/bash
declare -a files
shopt -s nullglob
files=(*)
count=36 # offset
for oldfilename in "${files[@]}"; do
(( count++ ))
# newfilename=$(echo "$oldfilename" | sed -e "s/^[1-9][0-9]?\.jpg/Scount\.png/")
# newfilename=${oldfilename/[1-9][0-9]?/Scount}
# newfilename=${oldfilename/[1-9][0-9]?/"Scount"}
newfilename=${oldfilename//[1-9][0-9]?/Scount}
echo mv -fv /path1/to/"${oldfilename}" /path2/to/"${newfilename}"
done
exit 0
私はその行に注釈を付けようとしました。/
との//
違いを知りませんnewfilename=${oldfilename/[1-9][0-9]?/"Scount"}
。 o_0?
編集する:
で表されるファイルの$oldfilename
形式1.jpg
はです99.jpg
。出力ファイルは$newfilename
37.png〜135.pngの形式でなければなりません(少なくとも呼び出しに関する限りsed
)。
どういうわけかファイル名が変更されず、ドットが消え.jpg
ました。なぜこれがうまくいかないのですか?
答え1
sed
私はあなたがregex:を一致させて置き換えたいあなたの(コメント付き)コマンド[1-9][0-9]?
から推測しています。
- 0以外の数字(
[1-9]
)の後に - 0または1桁(
[0-9]?
)
これは、1から99の整数(前にゼロが付いていない)に対して機能する非常に一般的な正規表現です。ただし、正規表現を使用する代わりに、パス名拡張パターン(ワイルドカードとも呼ばれます)を使用します。だからその意味は${parameter/pattern/string}
[1-9][0-9]?
- 0以外の数字(
[1-9]
)の後に - 数字(
[0-9]
)、その後に - 任意の文字(
?
)
それでも2桁のファイル名には機能しますが(なしで)使用し、名前を.
変更します。10.jpg
46jpg
.
質問の他の部分については、次の
//
項目をすべて置き換えてください。模様、/
最初のものだけを置き換えます。例えば、
$ i=cataract
$ echo "${i/a/X}"
cXtaract
$ echo "${i//a/X}"
cXtXrXct
答え2
rename
Perl(時にはPerlとも呼ばれる)がある場合は、prename
次のことができます。
rename -v 's!(\d+)(.*)\.jpg$!sprintf "%d%s.png", $1+36, $2!e' *.jpg
これは各ファイル名を取得し、先頭の数字、ファイル名コンポーネントの残りの部分、および末尾の数字を分割します.jpg
。次に、数値部分に36を追加し、元のファイル名の残りの部分を追加し、サフィックスを.png
。
rename -n ...
このアイテムの内容を変更すると、何が起こるかを確認または削除して-v
自動的に実行することができます。