xarg를 사용할 때 파일 이름의 발음 구별 부호 처리

xarg를 사용할 때 파일 이름의 발음 구별 부호 처리

xargs사람들이 파일 이름의 공백을 처리하는 데 문제가 있는 비슷한 질문을 여기에서 보았습니다 . 놀랍게도 저는 이 문제에 직면하지 않았지만 비슷한 문제가 발생했습니다.

많은 수의 파일에서 고정된 수의 파일(매우 혼란스러운 방식으로 무작위로 선택됨)을 복사하고 있습니다. 코드 줄은 다음과 같습니다.

find "/path/to/source/dir" -size +1k -type f -print0 | sort -R | ghead -z -n 10 | xargs -0 -I{} cp "{}" "/path/to/destination/dir"

각 파일의 이름이 사람의 이름을 따서 지정되므로 복권 당첨자와 비슷하다고 생각하세요. 그려진 사람들 중 일부는 우연히 독일인이었기 때문에 Matthäus Müller와 같은 매우 독일적인 이름을 가졌을 수도 있습니다. (다른 특수문자는 고려되지 않습니다.)

이 코드 몬스터가 이름(또는 더 정확하게는 파일 이름)에 움라우트가 있는 사람을 그릴 때마다 복사 프로세스가 중지됩니다.

cp: /path/to/source/dir/Matthäus Müller.jpg: No such file or directory

모든 파일 이름에는 공백이 있고 발음 구별 부호가 있는 파일 이름에서만 중단되므로 문제가 공백 문자 때문이 아니라는 점을 보장할 수 있습니다.

이 문제를 해결할 수 있는 방법이 있습니까? 아니면 전체 메커니즘을 다르게 작성해야 합니까(만약 그렇다면 어떻게)?

참고 1: 이러한 파일 이름을 "Matthaeus Mueller.jpg" 또는 이와 유사한 것으로 변경하면 이 문제를 피할 수 없습니다.

참고 2: 이것이 중요한 경우 이 스크립트는 macOS에서 실행됩니다.

답변1

-zNULL로 끝나는 레코드가 누락되었습니다 sort. 이 문제를 해결하면 문제가 사라집니다(어쨌든 제 경우에는). 발음 구별 부호가 있는 이름을 성공적으로 복사할 수 있는지 여부는 상당히 가능합니다. 실제로는 그것이 문제라고 생각하지 않습니다.

mkdir /tmp/610423/{src,dst}
cd /tmp/610423
touch 'src/Matthäus Müller.jpg' 'src/Peter Gurney' 'src/Tom Pearce'

# Error here
find /tmp/610423/src -type f -print0 | sort -R | head -zn10 | xargs -0 -I{} cp {} dst/
cp: cannot stat ''$'\n': No such file or directory

# No error here
find /tmp/610423/src -type f -print0 | sort -zR | head -zn10 | xargs -0 -I{} cp {} dst/

Debian Linux 배포판에서 테스트했습니다. 나는 당신이 ghead데비안에서 표준으로 사용하는 GNU 프로그램이라고 가정합니다. head당신은 sort그것을 가지고 있습니까 -z? 그렇지 않다면 -print0나머지 유틸리티의 성능을 다시 생각해 보는 것이 좋습니다 . 물론 괜찮습니다.

관련 정보