여러 파일 이름에서 날짜 이름을 바꾸는 방법

여러 파일 이름에서 날짜 이름을 바꾸는 방법

내 파일은 다음과 같습니다.

ABC_20210101.csv
ABC_20210101_imp.csv

파일 이름의 날짜를 특정 날짜로 업데이트하고 싶습니다.

ABC_20201231.csv
ABC_20201231_imp.csv

이러한 파일 이름을 어떻게 바꿀 수 있습니까?

답변1

GNU 병렬 처리 사용:

ls | parallel mv {} '{= s/(.*)\d{8}/${1}20210131/ =}'

테스트 대상:

this_123456789_file_19991231_some.thing

소프트웨어가 실행될 시스템에 소프트웨어를 설치할 수 있는 권한이 없으면 스크립트에 GNU Parallel을 직접 포함할 수 있습니다.

parallel --embed > newscript.sh

답변2

bash파일 이름을 분리하고 다시 결합할 수 있습니다 .

#!/bin/bash
new="20201231"

for file in *.csv
do
    # Split the filename into its consituent parts
    if [[ "$a" =~ (.*)[0-9]{8}(_imp)?(\.csv)$ ]]
    then
        # Assemble a new filename
        dest="${BASH_REMATCH[1]}${new}${BASH_REMATCH[2]}${BASH_REMATCH[3]}"
        if [[ ! -f "$dest" ]]
        then
            # No destination so rename
            [[ -t 2 ]] && echo "Rename $file as $dest" >&2
            echo mv -f "$file" "$dest"    # Remove "echo" to action
        fi
    fi
done

이것이 더 쉽지만 rename모든 시스템에 설치되어 있는 것은 아닙니다(제거 하거나 작업으로 -n교체 ).-v

new="20201231" rename -n 's/(.*)?[0-9]{8}(_imp)?(\.csv)$/$1$ENV{new}$2$3/' *.csv

사용할 수 없는 경우 bash또는 필요한 대상 파일 이름을 생성하는 데 사용할 rename수 있습니다. 틀림없이 이는 코드를 읽기가 더 쉽습니다( ERE 처리를 sed충족하기 위해 많은 백슬래시 이스케이프가 있는 RE 제외 ).sed

new="20201231"

for file in *.csv
do
    # Generate new filename
    dest=$(
        printf "%s\n" "$file" |
        sed -n 's/\(.*\)[0-9]\{8\}\(_imp\)\{0,1\}\(\.csv\)$/\1---\2\3/p'
    )

    if [ -n "$dest" ] && [ ! -f "$dest" ]
    then
        # Pattern substitued and target does not exist so rename
        [[ -t 2 ]] && echo "Rename $file as $dest" >&2
        echo mv -f "$file" "$dest"    # Remove "echo" to action
    fi
done

답변3

파일 이름을 바꾸는 한 가지 방법은 먼저 find 유틸리티 abd를 사용하여 파일을 선택한 다음 이를 sed에 전달하여 새 이름을 구성한 다음 tgen이 xargs에 쌍을 전달하여 mv 명령을 호출하여 이름을 바꾸는 것입니다.

d0=19710110
d8=$(seq -f '[0-9%g]' 8 | paste -sd'\0')
find . -maxdepth 1 -type f \( -name "*_${d8}_imp.csv" -o -name "*_$d8.csv" \) -print |
sed -Ee "h;/_[0-9]{8}((_imp)?[.]csv)\$/s//_$d0\1/;x;G" |
xargs -r -d'\n' -n2 -t mv -i

답변4

표준 POSIX sh쉘을 사용하면 다음과 같은 패턴을 작성할 수 있습니다.

./*[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].csv

그리고

./*[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_imp.csv

이는 현재 디렉토리에서 관심 있는 파일과 일치합니다. (물론 이를 더 구체적으로 만들 수 있으며, ./*20[0-2][0-9][01][0-9][0-3][0-9].csv예를 들어 유효하지 않은 날짜의 일치도 허용합니다.) 그런 다음 이러한 패턴과 일치하는 이름은 다음과 같이 이름을 바꿀 수 있습니다.

for name in ./*[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].csv
do
    [ ! -e "$name" ] && continue
    newname=${name%[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].csv}20201231.csv
    mv "$name" "$newname"
done

for name in ./*[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_imp.csv
do
    [ ! -e "$name" ] && continue
    newname=${name%[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_imp.csv}20201231_imp.csv
    mv "$name" "$newname"
done

교체는 ${variable%pattern}값 끝에서 일치하는 문자열을 제거합니다.pattern$variable

관련 정보