유닉스를 사용하여 디렉토리의 파일 이름을 바꾸는 방법은 무엇입니까?

유닉스를 사용하여 디렉토리의 파일 이름을 바꾸는 방법은 무엇입니까?

하위 디렉터리의 파일 이름을 바꾸는 방법은 무엇입니까?

이 샘플이 있습니다.

001a
    abc001.tif
    abc002.tif
    abc003.tif
002a
    abcd001.tif
    abcd002.tif
    abcd003.tif

모든 하위 디렉터리 001 - 00x에 있는 모든 파일의 이름을 바꾸고 싶지만 디렉터리 자체의 이름은 바꾸고 싶지 않습니다. 00011부터 시작하는 각 이미지 폴더부터 순차적으로 파일 이름을 바꾸고 싶습니다 .

이 명령을 실행하면 하위 폴더가 아닌 기본 폴더에서만 작동합니다. 각 하위 디렉터리에서 반복적으로 실행되고 각 디렉터리가 1로 시작하도록 하려면 무엇을 변경해야 합니까?

for file in $path/*.tif; do
       mv -v "${file}" "$path/$(printf "%04d" ${num}).tif"
       num=$(( ${num} + 1 ))
done

제가 사용하는 운영체제는 OSX 입니다

파일 이름에서 abc를 제거하고 싶습니다. 이것은 단지 예일 뿐입니다. 모든 파일이 abc로 시작하는 것은 아닙니다.

나는 이것을 시도했고 이름이 바뀌었지만 각 하위 디렉토리에서 하나로 시작하지 않습니다. 처음부터 제대로 작동하려면 무엇을 변경해야 합니까?

num=0
for file in */*.tif; do
    echo mv -v "${file}" "$(printf "%04d\n" $num).tif"
    (( num++ ))
done

What can I change in the script to not have it move the files out of the orignial directory

답변1

renamePerl 기반 도구(때때로 호출됨)가 설치되어 있는 경우 prename다음과 같이 한 줄로 이 작업을 수행할 수 있습니다.

rename -n 's|^.*|sprintf "%04d.tif", ++$a|e' */*.tif

작성된 대로, 이는 수행할 작업만 알려줍니다. 만족스러우면 -n자동 실행을 제거하거나 교체하고 -v무슨 일이 일어나는지 확인하세요.

이 도구가 없으면 귀하와 매우 유사한 루프를 작성할 수 있습니다.

num=0
for file in */*.tif; do
    echo mv -v "${file}" "$(printf "%04d\n" $num).tif"
    (( num++ ))
done

echo원하는 효과가 확실하다면 제거하세요.

관련 정보