UNIX ::文字列とmultipleNumberを含むファイルのパディング
Aug 23 2020
一貫したファイル名を持たないファイルがたくさんあります。
例えば
IMG_20200823_1.jpg
IMG_20200823_10.jpg
IMG_20200823_12.jpg
IMG_20200823_9.jpg
それらすべての名前を変更し、すべて同じ命名規則に従っていることを確認したいと思います
IMG_20200823_0001.jpg
IMG_20200823_0010.jpg
IMG_20200823_0012.jpg
IMG_20200823_0009.jpg
以下を使用して、番号のみのファイルに変更できることがわかりました
printf "%04d\n"
ただし、文字列+ "_" +異なる数値が混在しているため、ファイルを処理できません。
誰か助けてもらえますか?ありがとう!
回答
2 Cyrus Aug 23 2020 at 19:20
Perlのスタンドアロンrename
またはprename
コマンドを使用する場合:
rename -n 's/(\d+)(\.jpg$)/sprintf("%04d%s",$1,$2)/e' *.jpg
出力:
名前の変更(IMG_20200823_10.jpg、IMG_20200823_0010.jpg) 名前の変更(IMG_20200823_12.jpg、IMG_20200823_0012.jpg) 名前の変更(IMG_20200823_1.jpg、IMG_20200823_0001.jpg) 名前の変更(IMG_20200823_9.jpg、IMG_20200823_0009.jpg)
すべてが正常に見える場合は、を削除し-n
ます。
2 BenjaminW. Aug 23 2020 at 19:19
Bash正規表現の場合:
re='(IMG_[[:digit:]]+)_([[:digit:]]+)'
for f in *.jpg; do
[[ $f =~ $re ]]
mv "$f" "$(printf '%s_%04d.jpg' "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}")"
done
ここBASH_REMATCHで、は正規表現のキャプチャグループを含む配列です。インデックス0では完全一致です。インデックス1にはIMG_
、最初の数字のグループが含まれます。インデックス2には、2番目の数字グループが含まれています。このprintf
コマンドは、4桁幅のゼロパディングで2番目のグループをフォーマットするために使用されます。
1 KamilCuk Aug 23 2020 at 19:15
正規表現を使用して、入力から関連するサブ文字列を抽出し、それを埋め込みます...
- ファイルごと。
- ファイル名からプレフィックス、番号、サフィックスを抽出します。
- 数値にゼロを埋め込みます。
- 新しいファイル名を作成します。
- ファイルを移動する
bashの次のコード:
echo 'IMG_20200823_1.jpg
IMG_20200823_10.jpg
IMG_20200823_12.jpg
IMG_20200823_9.jpg' |
while IFS= read -r file; do # foreach file
# Use GNU sed to extract parts on separate lines
tmp=$(<<<"$file" sed 's/\(.*_\)\([0-9]*\)\(\..*\)/\1\n\2\n\3\n/')
# Read the separate parts separated by newlines
{
IFS= read -r prefix
IFS= read -r number
IFS= read -r suffix
} <<<"$tmp" # create new filename newfilename="$prefix$(printf "%04d" "$number")$suffix" # move the files echo mv "$file" "$newfilename"
done
出力:
mv IMG_20200823_1.jpg IMG_20200823_0001.jpg
mv IMG_20200823_10.jpg IMG_20200823_0010.jpg
mv IMG_20200823_12.jpg IMG_20200823_0012.jpg
mv IMG_20200823_9.jpg IMG_20200823_0009.jpg
rossifr Aug 24 2020 at 13:02
printfでのヒントに戸惑う...
現在のフォルダの内容:
$ ls -1 IMG_*
IMG_20200823_1.jpg
IMG_20200823_21.jpg
確かに良い解決策ではありませんが、printfとsedを使用すると次のことができます。
$ printf "mv %3s_%8s_%d.%3s %3s_%8s_%04d.%3s\n" $(ls -1 IMG_* IMG_* | sed 's/_/ /g; s/\./ /')
mv IMG_20200823_1.jpg IMG_20200823_0001.jpg
mv IMG_20200823_21.jpg IMG_20200823_0021.jpg