web-dev-qa-db-ja.com

Linuxでファイルのセットの名前を001、002、...に変更する

私はもともとimage_001.jpg、image_002.jpg、..の形式の画像のセットを持っていました。

私はそれらを調べて、いくつかを削除しました。次に、残ったファイルの名前をimage_001.jpg、image_002.jpg、...に戻します。

これをきちんと行うLinuxコマンドはありますか?私は名前の変更に精通していますが、このようなファイル名を注文するものが何も表示されません。 ls *.jpgはファイルを順番に(ギャップを付けて)リストするので、解決策はその出力をbashループなどに渡すことだと思いますか?

20
DisgruntledGoat

私が正しく理解していれば、あなたは例えばimage_001.jpg、image_003.jpg、image_005.jpgで、名前をimage_001.jpg、image_002.jpg、image_003.jpgに変更します。

編集:これは、一時ファイルを現在のディレクトリに配置するように変更されます。 Stephan202が指摘したように、tempが別のファイルシステム上にある場合、これは大きな違いを生む可能性があります。ループ内で一時ファイルにヒットするのを避けるために、イメージを通過するようになりました*

i=1; temp=$(mktemp -p .); for file in image*
do
mv "$file" $temp;
mv $temp $(printf "image_%0.3d.jpg" $i)
i=$((i + 1))
done                                      
13

単純なループ(echoでテスト、mvで実行):

I=1
for F in *; do
  echo "$F" `printf image_%03d.jpg $I`
  #mv "$F" `printf image_%03d.jpg $I` 2>/dev/null || true
  I=$((I + 1))
done

(追加した 2>/dev/null || true同一のソースファイルとターゲットファイルに関する警告を抑制します。これが気に入らない場合は、 Matthew Flaschen 's answer 。)を使用してください。

9
Stephan202

次のスクリプトを試してください。

numerate.sh

切り取られたこのコードは仕事をするはずです:

./numerate.sh -d <your image folder> -b <start number> -L 3 -p image_ -s .jpg -o numerically -r
2
Paul Weibert

ここにはすでにいくつかの良い答えがあります。ただし、エラーを非表示にすることに依存するものもありますが、これはお勧めできません(mvは、予期される条件のためにのみエラーになると想定しています。mvがエラーになる可能性がある他のすべての理由についてはどうでしょうか?)。

さらに、それは少し短くすることができ、よりよく引用する必要があります:

for file in *; do
    printf -vsequenceImage 'image_%03d.jpg' "$((++i))"
    [[ -e $sequenceImage ]] || \
        mv "$file" "$sequenceImage"
done

また、bashスクリプトでは 変数を大文字にしないでください であることに注意してください。

1
lhunath

これはあなたが求めていることの逆を行います(* .jpg.001の形式のファイルを取り、それらを* .001.jpgに変換します)が、あなたの目的のために簡単に変更することができます:

for file in * 

do

if [[ "$file" =~ "(.*)\.([[:alpha:]]+)\.([[:digit:]]{3,})$" ]]

then

mv "${BASH_REMATCH[0]}" "${BASH_REMATCH[1]}.${BASH_REMATCH[3]}.${BASH_REMATCH[2]}"

fi

done
1
ennuikiller

Forループ、イテレータ、cut -f1 -d "_"、次にmv i i.iteratorを使用して、上記のようなものを提案するつもりでした。ただし、すでに他の方法でカバーされているようです。

0
jess