まず、いくつかのファイル名をシミュレートしましょう。
$ printf 'kjdfh8\nskdjfh9\nckjhv10\naskjdh11\n'
kjdfh8
skdjfh9
ckjhv10
askjdh11
次に、パイプを介して'emを実行します。
$ printf 'kjdfh8\nskdjfh9\nckjhv10\naskjdh11\n' | sed 's/[^0-9]*\(.*\)/\1 &/' | sort -nr | cut -d\ -f2-
askjdh11
ckjhv10
skdjfh9
kjdfh8
これはどのように作動しますか?実はとても簡単です。まず、sed
行の先頭に数値コンテンツのコピーを配置するために使用します。次に、並べ替えます。最後にcut
、行の先頭の数字を取り除くために使用します。そして、voilà!
さて...それは順序を逆にします。それはあなたの質問の質問の1つですが、あなたの最終目標は物事の名前を変更することです。上記のリストを、whileループでもある別のパイプで拡張できます。今回は読みやすくするためにスペースを空けます。
#!/bin/bash
n=0
printf 'kjdfh8\nskdjfh9\nckjhv10\naskjdh11\n' \
| sed 's/[^0-9]*\(.*\)/\1 &/' | sort -nr | cut -d\ -f2- \
| while read file; do
base="${file/[0-9]*/}"
((n++))
printf 'mv "%s" "%s%s"\n' "$file" "$base" "$n"
done
このwhileループは、上記で作成したファイルのリストを読み取ります。ファイル名の最初の桁から始まるすべてのものを削除することにより、「ベース」を取得します。カウンター(新しい名前に使用)をインクリメントmv
してから、古いファイル名、ベース、およびカウンターを使用してコマンドを出力します。
この場合も、このスクリプトの出力はmv
、シェルを介してパイプできるコマンドのセットです。
printf
明らかに、これをファイルで使用するには、最初のコマンドをファイルのリストを生成するものに置き換える必要があります。
注:ファイル名に予期しない文字や特殊文字(スペースも含む)が表示されて計画が破棄されるリスクがあるため、通常、この方法でファイル名を処理することはお勧めできません。あなたがそれを理解していると確信している場合にのみこれを行ってください。