특정 이름 구조로 파일 이름을 바꾸는 방법은 무엇입니까?

특정 이름 구조로 파일 이름을 바꾸는 방법은 무엇입니까?

Linux에서 파일 이름을 바꾸는 쉘 스크립트를 작성하는 방법은 무엇입니까?

전임자:

234-2020-08-06-12-13-14-abc_up.csv

다음으로 이름이 바뀌었습니다.

234-abc_up-2020-08-06-12-13-14.csv

답변1

이 쉘 스크립트는 다음 작업을 수행합니다.

#!/bin/bash
old_filename=$1
IFS='-' read -r -a arr <<< $old_filename    # read dash-separated substrings into the array 'arr'
tmpsub=${arr[7]%.csv.gz}                    # extract 7th substring, stripping out the file extension
for i in $(seq 6 -1 1)                      # shifts right the substrings
do                                          # in the array by one 
    arr[$(($i+1))]=${arr[$i]}               # position, starting by 1
done
arr[1]=$tmpsub                              # set the substring 1 to the value of the previous 7th substring
new_filename=$(printf -- "-%s" "${arr[@]}") # join the substrings into a dash separated string
new_filename=${new_filename:1}".csv.gz"     # add the extension
mv $old_filename $new_filename              # rename the file

예를 들어 이름을 지정 rename_csv.sh하고 를 사용하여 실행 가능하게 만들면 chmod다음과 같이 원래 파일 이름만 사용하여 호출할 수 있습니다.

./rename_csv.sh 234-2020-08-06-12-13-14-abc_up.csv.gz

출력은 표시되지 않지만 파일 이름을 원하는 대로 바꿉니다.

답변2

파일 이름 변환을 시도해 볼 수 있습니다 sed(구문 힌트 GNU sed).

예:

echo "234-2020-08-06-12-13-14-abc_up.csv" | sed -E 's/(.*)-([[:digit:]]{4}(-[[:digit:]]{2}){5})-([^.]+).csv/\1-\4-\2.csv/'
234-abc_up-2020-08-06-12-13-14.csv

이것은 다음을 찾을 것입니다

  • "모든 문자열"("캡처 그룹" 1에 저장됨), 그 뒤에
  • 타임스탬프 YYYY-MM-DD-hh-mm-ss(예: 4자리, 5개의 "대시, 2자리 숫자"), "캡처 그룹" 2에 저장됨
  • "처음 발생한 기간을 제외한 모든 문자열", 캡처 그룹 4에 저장됩니다.

이 패턴은 "캡처 그룹 1", "캡처 그룹 4", "그룹 2 캡처"로 대체되며 그 뒤에는 .csv원하는 작업이 수행됩니다.

sedPOSIX 문자 클래스를 이해하지 못하는 경우 [[:digit:]].[0-9]

따라서 쉘 스크립트는 다음과 같습니다.

#!/bin/bash

fname="$1"
newname="$(sed -E 's/(.*)-([[:digit:]]{4}(-[[:digit:]]{2}){5})-([^.]+).csv/\1-\4-\2.csv/' <<< "$fname")"

mv "$fname" "$newname"

먼저 테스트하고 mv라인을 다음으로 교체하십시오.

echo "Would now execute 'mv $fname $newname'"

를 사용하지 않는 경우 bash명령 대체를 다음으로 변경해야 합니다.

newname="$(echo "$fname" | sed -E등.)"

관련 정보