複数のファイルの名前を昇順に変更する

複数のファイルの名前を昇順に変更する

次のファイルがあります

SSt12.precip.374.sub.climatology.ctl
SSt12.precip.2874.sub.climatology.ctl
SSt12.precip.3764.sub.climatology.ctl
SSt12.precip.6774.sub.climatology.ctl

ファイル名を次のように変更したいと思います。

SSt12.precip.1.sub.climatology.ctl
SSt12.precip.2.sub.climatology.ctl
SSt12.precip.3.sub.climatology.ctl
SSt12.precip.4.sub.climatology.ctl

答え1

そしてzsh

$ autoload zmv
$ n=0; zmv -n '(*.)<->(*.ctl)(#qn)' '$1$[++n]$2'
mv -- SSt12.precip.374.sub.climatology.ctl SSt12.precip.1.sub.climatology.ctl
mv -- SSt12.precip.2874.sub.climatology.ctl SSt12.precip.2.sub.climatology.ctl
mv -- SSt12.precip.3764.sub.climatology.ctl SSt12.precip.3.sub.climatology.ctl
mv -- SSt12.precip.6774.sub.climatology.ctl SSt12.precip.4.sub.climatology.ctl

-n実際に名前を変更せずにこれをやり直してください。)

GNUツールを使用し、ファイル名に改行文字が含まれていないと仮定すると、次のようにできます。

ls -v | awk -F. -vOFS=. -vORS='\0' '/\.ctl$/{print;$3=++n;print}' |
  xargs -r0n2 echo mv --

echo実際に名前を変更するには削除してください)

答え2

printf 'cp SSt12.precip.374.sub.climatology.ctl \
   SSt12.precip.%d.sub.climatology.ctl\n' $(seq 5) | 
. /dev/stdin

どうやらあなたは名前を変更する- こんな誤解をして申し訳ありません。

しかし、もしそうなら... 374 - 378と言ってみてください...

printf 'n=%d ; mv SSt12.precip.$((373+n)).sub.climatology.ctl \
   SSt12.precip.${n}.sub.climatology.ctl\n' $(seq 5) | 
. /dev/stdin

上記のコメントに関して、同じディレクトリにあり、一致する唯一のファイルであるとしますSSt12.precip.*.sub.climatology.ctl

set -- SSt12.precip.*[67]4.sub.climatology.ctl
printf 'echo mv %s SSt12.precip.$((n=n+1)).sub.climatology.ctl\n' "$@" | 
    . /dev/stdin

echo私のアカウントに後悔しないように上記の方法で弱めました。現在の形式では、実行したい操作のみが表示されます。一度削除すると、echoそのファイルはあなたのものであり、移動または失われる可能性があります。

正しいソート順序については、以下のStephaneの説明を参照してください。彼の言葉が正しい。

答え3

実際には、同じファイルではなく複数のファイルがあると想定して各ファイルの名前を変更するには、次のようにします。

for i in *ctl; do echo "$i"; done | 
    sort -t'.' -nk3 | 
        awk -F'.' -v OFS='.' '{printf "mv %s ", $0; $3=NR;print}' |
            sh

上記は、ファイル名が質問に示されているものと正確に一致すると仮定しています。すべて 3 つの点で区切られたフィールドで、数字があり、すべてctl

答え4

最初の障害は、ファイルを正しい順序でインポートすることです。ワイルドカードパターンは、SSt12.precip.*.sub.climatology.ctl数値順ではなく辞書順にファイル名を拡張するため、ファイルは2874、374、3764、6774の順に配置されます。

zshでは、次のおかげで簡単に解決できます。n グローバル予選SSt12.precip.*.sub.climatology.ctl(n))。他のシェルではより多くの作業が必要です。数値を抽出して並べ替えることができます。ファイル名に改行文字が含まれていない限り、次の方法があります。最初の2つの点で区切られた部分を削除し、最初の点で区切られた部分を除くすべての部分を削除して数字を抽出しました。

number=1
for x in SSt12.precip.*.sub.climatology.ctl; do
  number="${x#*.*.}"; number="${number%%.*}"
  printf "%d %s\n" "$number" "$x"
done | sort -k1,1n |
while IFS= read -r filename; do
  filename=${filename#* }
  suffix=${filename#*.*.*.}
  prefix=${filename%.*."$suffix"}
  mv -- "$filename" "$prefix.$number.$suffix"
  number=$((number+1))
done

関連情報