1

私は、次のように順番に並んでいるが連続していない画像を含むフォルダをたくさん持っています。

/根
  / f1
    img21.jpg
    img24.jpg
    img26.jpg
    img27.jpg
  / f2
    img06.jpg
    img14.jpg
    img36.jpg
    img57.jpg

そして、フォルダのタイトルとすべての画像を順番に並べて、次のように表示したいと思います。

/根
  / f1
    f1_01.jpg
    f1_02.jpg
    f1_03.jpg
    f1_04.jpg
  / f2
    f2_01.jpg
    f2_02.jpg
    f2_03.jpg
    f2_04.jpg

シェルスクリプトを使用してこれを行う方法がわかりません。

前もって感謝します!

4

2 に答える 2

2

ディレクトリ内では、lsファイルが字句順に表示され、正しい並べ替えが行われます。したがって、次のようなことができます。

let i=0
ls *.jpg | while read file; do
    mv $file prefix_$(printf "%02d" $i).jpg
    let i++
done

これにより、すべてのファイルが取得され、*.jpg名前が.prefix_00.jpgprefix_01.jpg

これは明らかに単一のディレクトリに対してのみ機能しますが、うまくいけば、これを使用して、必要なことを実行するものを構築できます。

于 2012-08-16T00:49:20.293 に答える
2

ループを使用forしてディレクトリを反復処理し、別のforループを使用してファイルを反復処理します。ファイルごとに 1 ずつインクリメントするカウンターを維持します。

先行ゼロで数値をパディングする直接的な便利な方法はありません。を呼び出すことはできますprintfが、それは少し遅いです。便利で手っ取り早い方法は、101 から数え始め (2 桁の数字が必要な場合、3 桁の数字が必要な場合は 1000 など)、先頭の 1 を削除することです。

cd /root
for d in */; do
  i=100
  for f in "$d/"*; do
    mv -- "$f" "$d/${d%/}_${i#1}.${f##*.}"
    i=$(($i+1))
  done
done

${d%/}/の末尾の$dストリップ、の先頭の${i#1}ストリップ、および最後の の後に続くものを除くすべてをストリップします。これらの構成については、シェルのマニュアルのパラメーター展開に関するセクションに記載されています。1$i${f##*.}$f.

このスクリプトは、ターゲット ファイル名が既存のファイル名と競合しないことを前提としていることに注意してください。というディレクトリがある場合img、いくつかのファイルが上書きされます。これが問題になる可能性がある場合、最も簡単な方法は、最初にすべてのファイルを別のディレクトリに移動し、名前を変更するときに元のディレクトリに戻すことです。

于 2012-08-16T01:09:45.513 に答える