파일 이름의 하위 문자열로 파일 이름 일괄 바꾸기

파일 이름의 하위 문자열로 파일 이름 일괄 바꾸기

파일이 있습니다

..
00016_0912RP10R6_RampMotorway9_0912RP10R6_13.646852_100.687103.jpg
00017_0912RP10R6_RampMotorway9_0912RP10R6_13.646956_100.686897.jpg
00018_0912RP10R6_RampMotorway9_0912RP10R6_13.647067_100.686684.jpg
...

가지고 싶다

00016.jpg
00017.jpg
00018.jpg

하위 폴더를 반복하고 이름을 바꾸는 가장 좋은 Linux 명령은 무엇입니까?

답변1

사용 find:

find . -type f -name '*_*.jpg' -exec sh -c '
    for pathname do
        newname=${pathname##*/}
        newname="${pathname%/*}/${newname%%_*}.jpg"
        printf "Would move %s to %s\n" "$pathname" "$newname"
        # mv -i "$pathname" "$newname"
    done' sh {} +

이것은 이름이 주어진 패턴과 일치하는 현재 디렉토리 안이나 아래의 모든 일반 파일의 경로 이름을 찾습니다. 이러한 경로 이름의 배치에 대해 주어진 경로 이름을 반복하고 파일 이름을 바꾸는 짧은 쉘 스크립트가 실행됩니다(실제 이름 바꾸기는 안전을 위해 주석 처리됩니다).

유사한 경로 이름이 주어지면 ./a/b/c/foo0_some_other_bits.jpg쉘 스크립트는 ./a/b/c/foo0.jpg먼저 디렉토리를 삭제(생성 )한 다음 foo0_some_other_bits.jpg첫 번째 문자 _이후의 모든 항목을 삭제하고 디렉토리를 다시 추가하여 이를 변환합니다. 경로 이름의 디렉토리 비트는 하나 이상의 문자가 포함된 경우 제거되고 대체됩니다 _. 이는 표준 매개변수 확장을 사용하여 수행됩니다.

globstar쉘 옵션을 사용하십시오 bash:

shopt -s globstar   # use "set -o globstar" in ksh93, or remove completely in zsh
for pathname in ./**/*.jpg; do
    [ -f "$pathname" ] || continue
    newname=${pathname##*/}
    newname="${pathname%/*}/${newname%%_*}.jpg"
    printf "Would move %s to %s\n" "$pathname" "$newname"
    # mv -i "$pathname" "$newname"
done

이는 위의 명령과 정확히 동일합니다 find. 유일한 차이점은 숨겨진 이름을 찾지 못한다는 것입니다( shopt -s dotglob이를 위해 추가됨).

답변2

매개변수 대체를 사용하는 간단한 방법 bash:

for file in *.jpg; do mv "${file}" "${file/_*/.jpg}";done

파일이 있는 디렉토리에서 실행하면 파일 전체를 반복합니다.

답변3

pax -rw -'s/_[^/]*\.jpg/.jpg/' -'s/.*//' . .

작동할 수도 있습니다.

관련 정보