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

正規表現を使用して、入力から関連するサブ文字列を抽出し、それを埋め込みます...

  1. ファイルごと。
  2. ファイル名からプレフィックス、番号、サフィックスを抽出します。
  3. 数値にゼロを埋め込みます。
  4. 新しいファイル名を作成します。
  5. ファイルを移動する

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