![파일을 찾아 "uuidgen"을 사용하여 이름을 바꾸고 확장자를 추가하세요.](https://linux55.com/image/93295/%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%B0%BE%EC%95%84%20%22uuidgen%22%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EC%9D%B4%EB%A6%84%EC%9D%84%20%EB%B0%94%EA%BE%B8%EA%B3%A0%20%ED%99%95%EC%9E%A5%EC%9E%90%EB%A5%BC%20%EC%B6%94%EA%B0%80%ED%95%98%EC%84%B8%EC%9A%94..png)
특정 폴더에 확장자가 없는 파일 목록이 있습니다. 이름을 바꾸고 확장자를 추가하고 싶습니다. 이름은 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
임의의 문자열 ) 로 사용할 수 있게 만듭니다 . , 이는 쉘이 에 할당하는 것입니다 . 쉘 명령을 살펴보겠습니다.$0
find
{}
$1
mv "$1" "$(uuidgen).ext"
그러면 파일 이름이 에서
$1
변경uuidgen
.$1
파일 이름에는 공백이나 기타 어려운 문자가 포함될 수 있으므로 단어 분리나 쉘 확장으로부터 이름을 보호하기 위해 큰따옴표 로 묶었습니다 .
우리는 두 가지 이유로 -execdir
대신 사용합니다:-exec
명령이 더 쉬워 집니다
mv
. 이름이 바뀐 파일이 동일한 디렉터리에 남아 있는지 확인하기 위해 추가 코드가 필요하지 않습니다.-execdir
더 안전함: 디렉토리 이름이 변경된 경우하지만명령find
이 실행 중이지만-exec
실행되고 있지 않으며-execdir
심하게 실패할 수 있습니다.
왜 새 쉘을 시작합니까?
다음을 사용해 보고 싶을 수도 있습니다.
find . -type f -name 'file*' -execdir mv {} "$(uuidgen).ext" \; # Don't do this
여기서 문제 uuidgen
는 한 번만 실행할 수 있다는 것입니다. 쉘이 실행됩니다uuidgen
앞으로심지어 find
명령을 시작합니다. 따라서 모든 mv
명령에는동일한대상 파일 이름. 우리 uuidgen
한번 달리고 싶다모든파일을 찾았습니다 find
. 그렇기 때문에 우리는 명령을 실행하고 실행해야 합니다 mv
.uuidgen
sh
더 효율적인 버전
위의 코드는 발견된 각 파일에 대해 새 셸을 시작합니다. 이에 비해 다음 접근 방식은 시작된 셸 프로세스당 수천 개의 파일을 처리할 수 있습니다.
find . -type f -name 'fi*' -execdir sh -c 'for f; do mv "$f" "$(uuidgen).ext"; done' Renamer {} +