콜론이 포함된 모든 파일 이름을 반복적으로 찾아 콜론을 대시로 바꿔야 합니까?

콜론이 포함된 모든 파일 이름을 반복적으로 찾아 콜론을 대시로 바꿔야 합니까?

나는 많은 하위 디렉터리를 포함하는 'main' 디렉터리를 가지고 있으며 이러한 하위 디렉터리 중 일부에는 콜론이 포함된 파일 이름이 있습니다. Linux에서 GitHub 저장소에 'main' 디렉터리를 업로드했지만 Windows 시스템에서 이 저장소에서 가져오려고 할 때 문제가 발생했습니다. Windows에서는 파일 이름에 콜론을 허용하지 않기 때문입니다.

Linux 터미널을 사용하여 'main' 디렉터리에서 콜론이 있는 모든 파일 이름을 반복적으로 찾은 다음 콜론을 대시(-) 문자로 바꾸려면 어떻게 해야 합니까?

답변1

find /path/to/directory -type f -name "*:*" -exec rename -n 's/:/-/g' {} +

(이 명령이 작동하지 않으면 이 답변 끝에 있는 호환성 참고 사항을 참조하세요.)

이것은 일어날 일만 인쇄하는 기본 안전 버전입니다. 실제로 이를 실현하려면 옵션을 제거하세요 -n.

없어도 작동 -name "*:*"하지만 변경해야 하는 파일 이름만 전달하는 것이 좋습니다. find이렇게 하면 전체 명령이 더 빨라지기 때문입니다.

다음과 같이 작동합니다:

  • find발견하다...
    • ...디렉토리에서 /path/to/directory...
    • ...모든 파일( -type f)...
    • ...일치하는 이름( -name "*:*"),...
    • ...그런 다음 실행합니다 rename(필요한 경우 여러 번)...
    • ...대체할 패턴 :으로 -...
    • ...발견된 모든 파일에서 여러 파일을 동시에( {} +).

노트:

  • 이 명령은 디렉터리 이름을 바꾸지 않으며 이는 의도적으로 설계된 것입니다.
  • 파일 이름에 일부 특이한 문자(예: 개행 문자)가 있으면 이름 바꾸기가 작동하지 않을 수 있습니다. 확실히 거기에는 그러한 파일 이름이 없으므로 이는 공식적인 참고 사항입니다.

호환성 참고

이 솔루션은 Debian, Ubuntu에서 사용 가능한 패키지 rename의 Perl 스크립트를 사용합니다. rename다른 배포판 rename에는 util-linux.

본 매뉴얼Perl이 아닌 경우의 솔루션은 다음 rename과 같아야 한다고 제안합니다.

find /path/to/directory -type f -name "*:*" -execdir rename -n ':' '-' {} +

(다시 한 번 -n올바르게 보이면 제거하십시오.) 그러나 이것을 테스트하지는 않았습니다. 파일 이름의 첫 번째 콜론만 대체할 것이라고 생각합니다. 해결 방법은 콜론이 더 이상 남지 않을 때까지 명령( 없이 -n, 포함 )을 반복하는 것입니다.-v

또는 다음에서 사용 가능한 아카이브에서 Perl 스크립트를 얻을 수 있습니다.이 장소(현재 File-Rename-0.20.tar.gz스크립트 이름은 입니다 rename.PL). 또한보십시오이 질문.

관련 정보