Bash를 사용하여 일관되지 않은 숫자 접미사가 포함된 파일 이름을 정렬하는 방법

Bash를 사용하여 일관되지 않은 숫자 접미사가 포함된 파일 이름을 정렬하는 방법

파일 이름 시작 부분의 숫자를 사용하여 일부 파일을 정렬한 다음 전체 파일 이름을 사용자에게 프롬프트와 비교할 수 있도록 목록 변수에 저장하려면 Linux 시스템(centos 7)에서 bash 스크립트를 만들어야 합니다. 스크립트 실행 시 입력된 숫자입니다.

그러나 파일 이름이 일관되지 않게 지정되었습니다.

파일 이름의 첫 번째 부분은 숫자이고 두 번째 부분은 텍스트이지만 일부 파일에는 파일 이름의 숫자 부분과 텍스트 부분을 구분하는 .(마침표/마침표) 확장자가 있고 일부 파일에는 그렇지 않습니다. 앞에 0이 있고 일부는 그렇지 않습니다. 예:

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

처음에는 정규식을 사용하여 파일을 정렬해야 한다고 생각했는데, 누군가 파일 이름이 불규칙하기 때문에 이렇게 하면 작동하지 않을 것이라고 지적하여 bash에 내가 사용하는 내장 함수가 있는지 궁금했습니다. 사용하는 것이 더 나을 것입니다 ...

어떤 조언이나 조언이라도 대단히 감사하겠습니다...

답변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모든 숫자는 파일 이름에서 추출되므로 선행 0은 무시 02.test.3.txt됩니다 23.


폴더에서 파일을 테스트로 사용하고 ./test.sh 2다음 출력에 따라 스크립트를 실행합니다.

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

관련 정보