폴더에 있는 모든 파일 이름의 일부를 제거하시겠습니까?

폴더에 있는 모든 파일 이름의 일부를 제거하시겠습니까?

내 카메라는 다음 형식으로 사진을 저장합니다.

DSC_0001 (2015_07_30 10_34_56 UTC).NEF

DSC_는 반복 후의 숫자와 시간과 날짜를 지정하는 괄호이지만 모든 시간과 날짜 정보는 메타데이터에 있으므로 생성되는 모든 파일의 이름을 다음과 같이 바꾸고 싶습니다.

DSC_0001.NEF etc

Bash에서 명령을 살펴봤지만 rename내가 원하는 작업을 수행하는 방법을 이해할 수 없습니다. 폴더의 모든 파일을 변경하고 싶습니다.

귀하의 제안이 효과적인 이유를 설명해 주시면 감사하겠습니다. 나중에 비슷한 문제를 해결하는 방법을 배우려고 노력할 수 있습니다.

노트:차이가 있다면 Bash를 사용하고 있습니다.

답변1

Perl 이름 바꾸기 도구를 사용하십시오.

rename 's/ \(.*?\)//' *.NEF

정규식은 간단해야 합니다( .*?가장 짧은 문자열과 일치).

아주 못생긴Debian/Ubuntu의 이름 바꾸기 유틸리티가 CentOS와 같은 다른 배포판의 이름 바꾸기 유틸리티와 다른 이유는 무엇입니까?두 가지 다른 명령에 대해 rename.

답변2

파일이 있는 경우하나의하위 디렉터리가 없는 폴더 photos:

for pathname in photos/*(*).NEF; do
    newname=${pathname##*/}
    newname=${newname%% '('*}.NEF

    printf 'Would move "%s" to "%s"\n' "$pathname" "${pathname%/*}/$newname"
    # mv -i "$pathname" "${pathname%/*}/$newname"
done

photos이는 a가 포함된 이름을 반복 (하고 ).NEF현재 경로 이름에서 디렉토리 이름을 제거한 다음 ␣(나머지 내용에서 뒤의 모든 내용(공백 및 )을 제거하고 이름 끝에 추가하여 새 파일 이름을 만듭니다.(.NEF

파일의 실제 이름 변경은 안전상의 이유로 주석 처리되었습니다.

위 코드의 출력 예:

Would move "photos/DSC_0001 (2015_07_30 10_34_56 UTC).NEF" to "photos/DSC_0001.NEF"

파일이 더 큰 디렉토리 구조 어딘가에 있는 경우:

find photos -type f -name '*(*).NEF' -exec sh -c '
    for pathname do
        newname=${pathname##*/}
        newname=${newname%% \(*}.NEF

        printf "Would move "%s" to "%s"\n" "$pathname" "${pathname%/*}/$newname"
        # mv -i "$pathname" "${pathname%/*}/$newname"
    done' sh {} +

여기서 유일한 차이점은 루프에 대해 관련 파일의 경로 이름이 생성되는 방식입니다. 이 경우 find발견된 경로 이름은 루프에 대량으로 전달되지만 루프 자체는 이 답변의 첫 번째 부분과 동일합니다(인용문이 약간 수정됨).

관련된:

답변3

(모든 파일 이름(경로 제외)에 공백 괄호( ) 쌍이 있는 경우 다음을 사용할 수 있습니다.

mv "$f" "${f%% (*}.NEF"

모든 파일을 반복하려면 다음을 수행하십시오.

$ for f in dir/*\(*\).NEF; do [ -f "$f" ] && mv "$f" "${f%% (*}.NEF"; done

답변4

파일과 동일한 디렉터리에 있어야 합니다.

let a=0; for i in *.NEF; do let a=a+1; b=`basename $PWD`; c=`printf %04d$b.NEF $a`; mv $i $c; done

동시에 모든 이름을 바꿉니다.

관련 정보