Bash - 入力番号で始まる数字でソートされたファイルの移動/名前の変更

Bash - 入力番号で始まる数字でソートされたファイルの移動/名前の変更

次のファイル番号のリストがあります。

01_file_name.log
01_file_name.txt
02_file_name.log
02_file_name.txt
03_file_name.log
03_file_name.txt
04_file_name.log
04_file_name.txt
05_file_name.log
05_file_name.txt

03*すべてのファイルに04*新しいファイルを挿入したいです。したがって、ワード番号から始めて03すべてのファイルを移動/名前変更し、前の番号を2ずつ増やす必要があります。したがって、リストは次のようになります。

01_file_name.log
01_file_name.txt
02_file_name.log
02_file_name.txt
05_file_name.log
05_file_name.txt
06_file_name.log
06_file_name.txt
07_file_name.log
07_file_name.txt

私は次のことを考えています。 bash script.sh 03 02while03は、$1起動するファイル名の番号と追加する番号です02$2入れ子にしてこれを達成しようとしましたが、ループがワード内の指定された番号のファイルのみを実行するようにfor-loopカウンターを使用する組み合わせを放棄する必要がありました。((++))

ベストアンサー1

これがあなたが望むものです。一つ:BASHでしか動作しないと思います。 MAXDIGITSオプションなので、3桁以上を使用する必要がある場合を備えています。使用しない場合は、その行を削除してください。

    #!/bin/bash

    BOTTOM=$1
    SHIFT=$2
    MAXDIGITS=0$3
    for filename in $(ls -r *.{txt,log}); do
        PREFIX=${filename%%_*}
        NEWPREFIX=$(expr $PREFIX + $SHIFT)
        if [ $PREFIX -ge $BOTTOM ]; then
            NEWPREFIX=$(printf %${MAXDIGITS}d $NEWPREFIX)
            mv $filename ${NEWPREFIX}_${filename#*_}
        fi
    done

指示:

    ./myscript <BOTTOM> <SHIFT> <MAXDIGITS>
    ### Example:
    ./miscript 03 02 2 #This means "Start at 03_filename.*, shift the prefixes by 2 and use 2 digits to construct the new prefixes".

同じディレクトリに同じ構文(prefix_filename。{txt、log})に従わない他のファイルがある場合は、フィルタリングする必要があります。そして、プレフィックスとファイル名を区別するために "_"を使用したので、それを変更したらコードを修正する必要があります。

おすすめ記事