내 폴더와 하위 폴더에 많은 파일이 있습니다.
모든 파일 이름에서 일부 문자(동일한 위치)를 제거해야 합니다.
예:
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'