次のフォルダ構造があります。
drwxr-xr-x 2 root root 4096 Jun 30 21:34 dir_0.0.1_2
drwxr-xr-x 2 root root 4096 Jul 2 23:45 dir_0.0.1_1
-rw-r--r-- 1 root root 24 Jul 3 00:03 a.sh
drwxr-xr-x 2 root root 4096 Jul 3 00:04 dir_0.0.1_3
スクリプトは、同じディレクトリに次dir_0.0.1
の名前の新しいディレクトリを作成します。a.sh
新しく作成されたディレクトリの名前を変更するようにスクリプトにカウンタを適用するにはどうすればよいですかdir_0.0.1_4
?
答え1
zshから:
set -- dir_0.0.1_*(oe['REPLY=${REPLY##*_}']n[-1])
mv dir_0.0.1 dir_0.0.1_$(( ${1##*_} + 1 ))
これは$1
位置引数(ここでのみ使用されます)をワイルドカード拡張に設定しますdir_0.0.1_*(oe['REPLY=${REPLY##*_}']n[-1])
。
- ファイル名は次に終わる必要があります。
dir_0.0.1_
- その後、ファイル名は
o
後続の式を使用してe[ ... ]
ソートされます。 _
最後の下線まで、できるだけ多くの先行文字を削除して、生成されたファイル名の部分にソートキーを設定します。n
数値順に並べ替え- 次に、ファイル名のリストを分割して最後の要素(
[-1]
)を返します。
現在インデックス化されている最大のファイル名は現在です$1
。数字拡張子内で数字を検索し、$(( ))
(先行文字も削除して_
)1を追加し、前に静的プレフィックスを付けます。
Bashはファイル名を繰り返し、手動でインデックスを比較します。
# safe starting point
greatest=-1
for d in dir_0.0.1_*; do n=${d##*_}; [ "$n" -gt "$greatest" ] && greatest=$n; done
mv dir_0.0.1 dir_0.0.1_$(( greatest + 1))
Bashループ解析(実際にshと互換性があります):
- 私たちはおおよそ安全なインデックスの始点を設定することから始めます。私たちが見つけた出発点より低いことが保証されます。
for
ワイルドカードを含むループを使用して、各ディレクトリの既存のディレクトリ名を取得します。- 前半から最後の下線まですべてを削除して、最後にインデックスをキャプチャします。
- インデックスをテストして、現在のトップインデックスより大きいことを確認してください。その場合は、トップインデックスをリセットしてください。
- ループが完了したら、「top + 1」値を追加してディレクトリの名前を変更します。
別のオプションは、未使用のインデックスが見つかるまでインデックスに対して無差別の代入ループを実行することです。
# set this to something you know exists
index=1
while [ -e dir_0.0.1_"${index}" ]; do index=$((index + 1)); done
mv dir_0.0.1 dir_0.0.1_"${index}"
$index
この値は、その名前のディレクトリが表示されるまで増加します。いいえ存在する。次に、未使用の番号を使用して名前を変更します。