파일이 있습니다
..
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/.*//' . .
작동할 수도 있습니다.