ファイル名を1から無制限に自動変更

ファイル名を1から無制限に自動変更

複数のファイルの名前を1から無限(すべてのファイルを含む)に変更するには?

私のファイルは次のとおりです。

file.jpeg.jpg
fileA.jpeg.jpg
fileB.jpeg.jpg

出力:

1.jpeg.jpg
2.jpeg.jpg
3.jpeg.jpg

Cygwinを使用しているため、パッケージをインストールできません

答え1

努力する:

n=0; for f in *.jpg; do mv "$f" "$((++n)).jpeg.jpg"; done

あるいは、同じ内容が複数行にわたって広がります。

n=0
for f in *.jpg
do
    mv "$f" "$((++n)).jpeg.jpg"
done

どのように動作しますか?

  • n=0

    これは変数nnを初期化します。

  • for f in *.jpg; do

    これにより、名前で始まる現在のディレクトリを繰り返すループが始まります.jpg

  • mv "$f" "$((++n)).jpeg.jpg"

    必要に応じてファイル名が変更されます。 Bashは$((...))算術演算を実行します。ここではn、実行するたびに増加するようにします。

  • done

    これはサイクルの終わりを示します。

このコードは、名前にスペース、タブ、改行、またはその他の難しい文字を含むファイルが含まれている場合にも機能します。

注文する

glob はtest*.inファイルのリストに展開されます。アルファベット順に注文する。これに関する文書は次のとおりですman bash

bashは各単語で*、?と[文字を検索します。これらの文字のいずれかが現れると、その単語はパターンと見なされます。 アルファベット順のリストに置き換えられましたパターンに一致するファイル名(以下のパターン一致を参照)[強調表示します。 ]

アルファベット順の意味は地域によって異なります。

答え2

j=0;
for i in `ls`
do
     mv $i $j.jpeg.jpg
     j=`echo $j + 1 | bc`
done

答え3

ファイル数は「無制限」である可能性があるため、コマンドラインサイズにはデフォルトで制限があります。バラよりhttps://stackoverflow.com/questions/19354870/bash-command-line-and-input-limit。だから私はそれをトラブルfindシューティングに使用します。たとえば、bashでは:

cd /path/to/directory
n=1
find . -maxdepth 1 -type f -name "*.jpeg.jpg" | sort |  while read file; do
    mv "$file" $n.jpeg.jpg
    let n=n+1
done

ステップは1行ずつ次のようになります。

  1. 適切なディレクトリに切り替える
  2. ファイルカウンタを1に設定
  3. find(現在)ディレクトリ.にあり、サブディレクトリ()にドリルダウンせずに-maxdepth 1通常のファイルのみを表示し、-type f名前がパターンと一致するファイルのみを返すことによって*.jpeg.jpgその名前を印刷します(デフォルトでは)。 findコマンドの出力をsortコマンドにパイプして順番に並べ替えます(sortは非常に大きな標準入力を処理できます)。ソートの出力は、入力の各行を1行ずつ変数にwhile設定する/ループにパイプされます。readfile
  4. file変数に名前が格納されているファイルを変数名のファイルに移動し、$n「.jpeg.jpg」という文字列に連結します。
  5. 変数nを追加
  6. 次のファイル名で繰り返します。

この方法で非常に大きなディレクトリを処理できます。 「奇妙な」(別名「印刷可能なASCIIセットにない文字」)ファイル名の影響を受けません。より免疫を持たせることができますが、この場合は必要ありません(オプション-print0xargsコマンドの使用を含む)。

答え4

このバージョンでは、新しいファイルをアルファベット順に一覧表示した場合(出力に表示されます)、同じ順序で保持されますls

#!/bin/sh
i=0
for f in *.jpeg.jpg
do
     mv "$f" "$(printf '%011d.jpeg.jpg' $i)"
     i=$(expr $i + 1)
done

関連情報