複数のファイルの名前を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
これは変数
n
nを初期化します。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に設定
find
(現在)ディレクトリ.
にあり、サブディレクトリ()にドリルダウンせずに-maxdepth 1
通常のファイルのみを表示し、-type f
名前がパターンと一致するファイルのみを返すことによって*.jpeg.jpg
その名前を印刷します(デフォルトでは)。 findコマンドの出力をsortコマンドにパイプして順番に並べ替えます(sortは非常に大きな標準入力を処理できます)。ソートの出力は、入力の各行を1行ずつ変数にwhile
設定する/ループにパイプされます。read
file
file
変数に名前が格納されているファイルを変数名のファイルに移動し、$n
「.jpeg.jpg」という文字列に連結します。- 変数nを追加
- 次のファイル名で繰り返します。
この方法で非常に大きなディレクトリを処理できます。 「奇妙な」(別名「印刷可能なASCIIセットにない文字」)ファイル名の影響を受けません。より免疫を持たせることができますが、この場合は必要ありません(オプション-print0
とxargs
コマンドの使用を含む)。
答え4
このバージョンでは、新しいファイルをアルファベット順に一覧表示した場合(出力に表示されます)、同じ順序で保持されますls
。
#!/bin/sh
i=0
for f in *.jpeg.jpg
do
mv "$f" "$(printf '%011d.jpeg.jpg' $i)"
i=$(expr $i + 1)
done