Bashを使用して一貫性のない数値サフィックスを含むファイル名をソートする方法

Bashを使用して一貫性のない数値サフィックスを含むファイル名をソートする方法

ファイル名の先頭の数字でいくつかのファイルをソートし、ファイル名をユーザーにプロンプ​​トと比較できるようにリスト変数に保存するには、Linuxシステム(centos 7)でbashスクリプトを作成する必要があります。スクリプトの実行時に入力された番号。

ただし、ファイル名が一貫しないように指定されました。

ファイル名の最初の部分は数字で、2番目の部分はテキストですが、一部のファイルにはファイル名の数字部分とテキスト部分を区切る拡張子(ピリオド/ピリオド)があり、一部のファイルにはありません。前にゼロがあり、一部はそうではありません。例:

001file.txt
2.file.txt
03file.txt
022.file.txt
28file.txt 

最初は正規表現を使ってファイルをソートする必要があると思いましたが、誰かがファイル名が不規則であるため、これはうまくいきません。使用する方が良いでしょう...

どんなアドバイスやアドバイスにも感謝します...

答え1

#!/bin/bash

# declare the arrays for the files and the sorting
declare -A files
declare -A sorting

# get a list of filenames into it, saving number without 0's as key
for file in *; do
    fnum=$(echo "$file" | tr -d -c 0-9 | sed 's/^0*//')
    files[$fnum]="$file"
    sorting[$fnum]=$fnum
done

# sort the array by its numeric key values
IFS=$'\n' sorted=($(sort -n <<<"${sorting[*]}"))
unset IFS

# check for user input and if its numerical
if [[ $1 =~ ^-?[0-9]+$ ]]; then
    # iterate through the array
    for i in "${sorted[@]}"; do
        # only handle files above user input number
        if [[ $i -gt $1 ]]; then
            # execute your sql here, echo is just for debugging
            echo ${files[$i]}
        fi
    done
else
    echo "Please supply a number as argument"
    exit 1
fi

スクリプトは、ファイルの番号を各エントリのキーとして使用し、そのファイル名を値として使用して、現在のディレクトリ内の各ファイルを連想配列に格納します。trすべての数字はファイル名から抽出されるため、先行ゼロは無視され02.test.3.txtます23


フォルダ内のファイルをテストとして使用し、./test.sh 2次の出力に従ってスクリプトを実行します。

03file.txt
022.file.txt
28file.txt

関連情報