次の形式のファイルがあります。x1 x2 ... x10 x11 ... x101 ...
これらのファイルの名前をすべて同じ名前の長さにするように変更したいと思います。x001 x002 ... x010 ...
数字以外の接頭辞を持たないファイルに対してこれを行うことができますが(末尾のみを使用sort -n
)、while read x;
ファイル名で始まらないと、ソートは数値を認識しません。
答え1
v
たとえば、(version)オプションを使用してファイルを並べ替えることができます。あるいは、数値ソートを区切り文字として使用することもできます。 ls
ls -1v
x
ls | 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