1

Foo_Jan_2013.pdf、、、Bar_Feb_2012.pdfのような名前の PDF ファイルが約 1000 個ありFoo_Mar_2013.pdfますBar_Mar_2013.pdfFoo_01_2013.pdfこれらのファイルの名前を、月名を、Bar_02_2012.pdfFoo_03_2013.pdf、などの数字に置き換えたいと考えていますBar_03_2013.pdf

私が試した 1 つのアプローチは、2 つの配列 (1 つは一致パターン用、もう 1 つは置換パターン用) を定義し、次のように検索置換でそれぞれの配列メンバーを使用することです。

match=(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
replace=(01 02 03 04 05 06 07 08 09 10 11 12);

for FILE in *.pdf;
do 
    for i in {0..11};    
    do
        echo ${match[i]} ${replace[i]};  # Note, see below
        echo ${FILE/${match[i]}/${replace[i]}};
    done
done

Noteとマークされた行は期待どおりJan 01Feb 02、 などを出力しますが、次の行でそれらを検索または置換パターンとして使用しても効果がなく、そのまま出力$FILEされます。

また、次の両方が機能することを確認しました。

${FILE/Jan/01};

foo=Jan;
bar=01;
${FILE/$foo/$bar};

上記で試みたように、配列メンバーをパターンとして使用することは可能ですか? もしそうなら、正しい構文は何ですか? そうでない場合、この問題を解決するために他にどのようなオプションが必要ですか?

4

3 に答える 3

2

BASH は、ユース ケースに適した連想配列をサポートしています。

# Initialize the associative array
declare -A months

# Fill in the array with the month string as the key and the zero-padded month number as the value
num=0
for m in Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec; do
  ((num++))
  months[$m]=$(printf '%02d' $num)
done

# Test your examples
for file in Foo_Jan_2013.pdf Bar_Feb_2012.pdf Foo_Mar_2013.pdf Bar_Mar_2013.pdf; do
  month=$(cut -d_ -f2 <<<"$file")
  new_name="${file/$month/${months[$month]}}"
  echo "$file -> $new_name"
done

出力:

Foo_Jan_2013.pdf -> Foo_01_2013.pdf
Bar_Feb_2012.pdf -> Bar_02_2012.pdf
Foo_Mar_2013.pdf -> Foo_03_2013.pdf
Bar_Mar_2013.pdf -> Bar_03_2013.pdf
于 2013-10-05T17:23:37.053 に答える
1

iscfrctorekによる回答とdevnullによるコメントをまとめ、次のように問題を解決しました。

# Initialize an associative array with (month name, number) pairs
declare -A map=([Jan]=01 [Feb]=02 [Mar]=03 [Apr]=04 [May]=05 [Jun]=06 
[Jul]=07 [Aug]=08 [Sep]=09 [Oct]=10 [Nov]=11 [Dec]=12);

# For each month name, use 'rename' command on filenames having the month name
for m in ${!map[@]};
do
    eval rename \'s/$m/${map[$m]}/\' *$m*.pdf
done

このアプローチでは、各ファイル名はそれに含まれるパターン(12 か月の名前すべてではない)に対してのみ照合され、私の質問のネストされたループ構造は回避されます。また、追加のパイプを使用せず、「セパレーター」が と異なる場合でも機能し_ます。

于 2013-10-06T05:56:05.180 に答える