파일 이름에서 일부 문자를 반복적으로 제거

파일 이름에서 일부 문자를 반복적으로 제거

내 폴더와 하위 폴더에 많은 파일이 있습니다.

모든 파일 이름에서 일부 문자(동일한 위치)를 제거해야 합니다.

예:

IMG-20230226-WA0002.jpg -> 20230226-WA0002.jpg

를 사용하는 것이 가장 쉬운 방법이라고 생각해서 echo ${i:N:N}그렇게 했습니다.

for i in $(find . -type f); do mv "$i" "${i:5}; done

전체 경로가 포함된 파일을 표시하고 있다고 생각했는데 어떻게 하면 올바르게 수행할 수 있습니까?

추신: "문자열"에 대해 어떻게 이 작업을 수행할 수 있습니까? 예를 들어, IMG-파일에서 문자열을 제거하시겠습니까?

PS2: 명령을 사용하고 싶지 않습니다 rename.

감사해요.

답변1

이와 같이:

find . -type f -regextype egrep \
    -regex '.*/[[:alnum:]-]{7,}.*\.jpg$' -execdir bash -c '
        for file; do echo mv "$file" "${file:7}"; done
' bash {} +

2: 5+2 = 7파일이 .로 끝나기 때문에 추가했습니다 ./.

문자열의 경우:

find . -type f -name '*.jpg' -execdir bash -c '
    for file; do echo mv "$file" "${file#./IMG-}"; done
' bash {} +

또는 globstar재귀를 사용하십시오.

shopt -s globstar

for file in **/*.jpg; do
   ( cd "$(dirname "$file")" && echo mv "$file" "${file#IMG-}" )
done

echo출력에 만족하면 명령문을 삭제하십시오.


마음이 바뀌면진주의rename:

rename -n -d 's/.*/substr($&, 5)/e' ./**/*.jpg
rename -n -d 's/^IMG-//' ./**/*.jpg

-n스위치, 일명.시운전당신의 시도가 만족스러울 때실제 이름으로 변경.

-d스위치는 파일 이름만 바꾸고 파일 경로는 삭제합니다.


find현재 파일의 디렉토리에서 일치하는 각 항목에 대해 -execdir작업을 수행합니다.cd


쉘을 방지하기 위해 for반복하는 데 루프를 사용하지 마십시오.find분사.

답변2

이 도구를 확인해 보세요 mmv. 이는 모든 최신 배포판에 존재해야 하며 원하는 작업을 정확하게 수행해야 합니다.

여기에 대한 예는 다음과 같습니다

mmv 'IMG-*.jpg' '#1.jpg'

처음 4자를 제거하려면 다음을 수행하십시오.

mmv '????*.jpg' '#5.jpg'

관련 정보