파일을 찾아 "uuidgen"을 사용하여 이름을 바꾸고 확장자를 추가하세요.

파일을 찾아 "uuidgen"을 사용하여 이름을 바꾸고 확장자를 추가하세요.

특정 폴더에 확장자가 없는 파일 목록이 있습니다. 이름을 바꾸고 확장자를 추가하고 싶습니다. 이름은 UUID여야 합니다. 나는 그것들을 찾는 방법을 알고 있고 UUID를 생성하기 위한 유틸리티 "uuidgen"이 있습니다. 나머지는 어떻게 합니까?

find . -type f -name 'file*' # ??? -exec .... ???

답변1

노력하다:

find . -type f -name 'file*' -execdir sh -c 'mv "$1" "$(uuidgen).ext"' Renamer {} \;

어떻게 작동하나요?

  • find . -type f -name 'file*' -execdir ... \;

    이 부분은 여러분에게 익숙할 것 같습니다. glob과 일치하는 이름을 가진 파일을 찾고 file*해당 파일에 대해 명령을 실행합니다. ...이 경우에는 ...다음으로 바꿉니다.

  • sh -c 'mv "$1" "$(uuidgen).ext"' Renamer {}

    이는 쉘을 시작하고, mv 명령을 실행하고, 파일 이름을 $1.( 쉘에 할당되고 오류 메시지가 생성되면 쉘에서 사용되는 Renamer임의의 문자열 ) 로 사용할 수 있게 만듭니다 . , 이는 쉘이 에 할당하는 것입니다 . 쉘 명령을 살펴보겠습니다.$0find{}$1

  • mv "$1" "$(uuidgen).ext"

    그러면 파일 이름이 에서 $1변경 uuidgen.

    $1파일 이름에는 공백이나 기타 어려운 문자가 포함될 수 있으므로 단어 분리나 쉘 확장으로부터 이름을 보호하기 위해 큰따옴표 로 묶었습니다 .

우리는 두 가지 이유로 -execdir대신 사용합니다:-exec

  1. 명령이 더 쉬워 집니다 mv. 이름이 바뀐 파일이 동일한 디렉터리에 남아 있는지 확인하기 위해 추가 코드가 필요하지 않습니다.

  2. -execdir더 안전함: 디렉토리 이름이 변경된 경우하지만명령 find이 실행 중이지만 -exec실행되고 있지 않으며 -execdir심하게 실패할 수 있습니다.

왜 새 쉘을 시작합니까?

다음을 사용해 보고 싶을 수도 있습니다.

find . -type f -name 'file*' -execdir mv {} "$(uuidgen).ext" \; # Don't do this

여기서 문제 uuidgen는 한 번만 실행할 수 있다는 것입니다. 쉘이 실행됩니다uuidgen 앞으로심지어 find명령을 시작합니다. 따라서 모든 mv명령에는동일한대상 파일 이름. 우리 uuidgen한번 달리고 싶다모든파일을 찾았습니다 find. 그렇기 때문에 우리는 명령을 실행하고 실행해야 합니다 mv.uuidgensh

더 효율적인 버전

위의 코드는 발견된 각 파일에 대해 새 셸을 시작합니다. 이에 비해 다음 접근 방식은 시작된 셸 프로세스당 수천 개의 파일을 처리할 수 있습니다.

find . -type f -name 'fi*' -execdir sh -c 'for f; do mv "$f" "$(uuidgen).ext"; done' Renamer {} +

관련 정보