数字以外の接頭辞がある場合は、ファイル名を数字でソートします。

数字以外の接頭辞がある場合は、ファイル名を数字でソートします。

次の形式のファイルがあります。x1 x2 ... x10 x11 ... x101 ...

これらのファイルの名前をすべて同じ名前の長さにするように変更したいと思います。x001 x002 ... x010 ...

数字以外の接頭辞を持たないファイルに対してこれを行うことができますが(末尾のみを使用sort -n)、while read x;ファイル名で始まらないと、ソートは数値を認識しません。

答え1

vたとえば、(version)オプションを使用してファイルを並べ替えることができます。あるいは、数値ソートを区切り文字として使用することもできます。 lsls -1vxls | sort -n -t 'x' +1

ただし、名前を変更するためにファイルを並べ替える必要はありません。ファイル名の長さを見て、必要に応じてゼロで埋めることができます。これはこれを行う小さなスクリプトです。

prefix=x
maxLength=4

for file in ${prefix}*
do
 if [ ${#file} -lt $maxLength ]
 then
     newFile=$file
     while [ ${#newFile} -lt $maxLength ]
     do
       newFile=${newFile/$prefix/${prefix}0}
     done   
     mv $file $newFile
 fi
done

答え2

まずソートする必要がありますか?

m=0
for f in x*; do
  [ "${#f}" -gt "$m" ] &&
    m=${#f}
done

for f in x*; do
  echo mv -- "$f" "${f%${f#?}}$( printf '%0.*d' $(( m - 1 )) "${f#?}" )"
done 

printf実装が上記の構文をサポートしていない場合printf "%0.$(( m - 1 ))d" "${f#?}"

満足したらエコーを取り除きます。

答え3

ドッグベーンについて詳しく説明する回答sortバージョンソートオプションがあります。一部のプラットフォーム(busyboxなど)にはこのオプションはありません。

次のように使用できます。

sort -V
sort --version-sort

または、n番目の列でバージョンソートを実行します。

sort -knV

答え4

名前を変更する必要があり、次のツールが役立ちます。

touch x1 x2 x10 x11 x101 
ls ; rename 's/x/x0/' x[0-9] 

x1 x10 x101 x11 x2

ls ; rename 's/x/x0/' x[0-9][0-9] 

x01 x02 x10 x101 x11

ls

x001 x002 x010 x011 x101

「名前の変更」は、少なくともLinuxをインストールする必要がある場合は、一部のPerlパッケージの一部です。

名前を変更せずにループを使用する同様の解決策があります。

rm * 
touch x1 x2 x10 x11 x101
for f in  x[0-9] ; do mv $f ${f/x/x0}; done 
for f in  x[0-9][0-9] ; do mv $f ${f/x/x0}; done ; ls 

x001 x002 x010 x011 x101

関連情報