이상한 이름을 가진 파일에서 두 블록을 찾아 rsync

이상한 이름을 가진 파일에서 두 블록을 찾아 rsync

이것은 나에게 큰 문제가 아니지만 rsync와 find가 매우 강력하다고 생각했기 때문에 rsync가 파일에서 차단되었을 때 놀랐고 find가 동일한 작업을 수행했습니다. ls -l파일이 6093바이트임을 보여줍니다(디렉토리에 있는 유일한 파일이므로 디렉토리에 CD를 넣은 후에 이 작업을 수행합니다).

# find . -size 6093c
./????????????????????????:??????????????????????????????????????????
find: './\353\266\204\353\245\230:\353\257\270\352\265\255\354\235\230_\355\205\224\353\240\210\353\271\204\354\240\204_\352\262\214\354\236\204_\354\207\274': No such file or directory

이게 무슨 뜻인지 아시나요? 이상한 점은,

# find . -size 6093c | xargs less

잘 작동합니다. 이것이 ls가 보는 것입니다:

# ls -lat | fgrep "6093 "
ls: cannot access ''$'\353\266\204\353\245\230'':'$'\353\257\270\352\265\255\354\235\230''_'$'\355\205\224\353\240\210\353\271\204\354\240\204''_'$'\352\262\214\354\236\204''_'$'\354\207\274': No such file or directory
-rw-rw-r--. 1 nobody nobody   6093 Oct 23  2013 หมวà¸à¸«à¸¡à¸¹à¹:à¹à¸à¸¡à¹à¸à¸§à¹à¸­à¹à¸¡à¸£à¸´à¸à¸²

결과를 더 적게 파이프하면 약간 더 좋습니다.

# ls -lat | fgrep "6093 " | less

ls: cannot access ''$'\353\266\204\353\245\230'':'$'\353\257\270\352\265\255\354\235\230''_'$'\355\205\224\353\240\210\353\271\204\354\240\204''_'$'\352\262\214\354\236\204''_'$'\354\207\274': No such file or directory
-rw-rw-r--. 1 nobody nobody   6093 Oct 23  2013 <E0><B8><AB><E0><B8><A1><E0><B8><A7><E0><B8><94><E0><B8><AB><E0><B8><A1><E0><B8><B9><E0><B9><88>:<E0><B9><80>
<E0><B8><81><E0><B8><A1><E0><B9><82><E0><B8><8A><E0><B8><A7><E0><B9><8C><E0><B8><AD><E0><B9><80><E0><B8><A1><E0><B8><A3><E0><B8><B4><E0><B8><81><E0><B8><B2>

동일한 디렉토리에 ls로도 처리할 수 없는 파일이 있지만 가장 오래된 항목으로 표시되므로 나열할 수 있습니다.

# ls -lat | tail -1 | less
ls: cannot access ''$'\353\266\204\353\245\230'':'$'\353\257\270\352\265\255\354\235\230''_'$'\355\205\224\353\240\210\353\271\204\354\240\204''_'$'\352\262\214\354\236\204''_'$'\354\207\274': No such file or directory
-?????????? ? ?      ?           ?            ? <EB><B6><84><EB><A5><98>:<EB>
<AF><B8><EA><B5><AD><EC><9D><98>_<ED><85><94><EB><A0><88><EB><B9><84><EC><A0>
<84>_<EA><B2><8C><EC><9E><84>_<EC><87><BC>

특별히 중요하지는 않지만 조금 궁금합니다.

편집: 이 질문은 빠르게 많은 관심을 받을 것 같아서 몇 가지 "조사"를 수행했습니다(완전히 정확할 수도 있고 정확하지 않을 수도 있음). 문제를 재현할 수는 없지만 다음과 같습니다.

  • 2013년 10월 23일이나 그 무렵에 나는 미국 게임 쇼에 대한 wikidata.org 페이지를 방문했습니다. 당시 상황은 다음과 같았다.https://www.wikidata.org/w/index.php?title=Q7213876&direction=prev&oldid=85645107

  • 그런 다음 하나 이상의 외국어 링크를 클릭했습니다.

  • 내가 팔로우하는 외국 링크에서 나는https://en.wikipedia.org/wiki/DownThemAll! 모든 링크를 다운로드하세요.

  • 이렇게 하면 특수 문자가 포함된 파일 이름이 많이 생성되며, 이것이 내가 이 두 개의 이상한 파일을 얻은 방법이라고 거의 확신합니다.

  • 그러나 오늘 이 작업을 수행하면 여전히 특수 문자가 포함된 파일 이름이 표시되지만 정확히 아래의 이름은 표시되지 않습니다.

답변1

이 이상한 이름의 파일은 붉은 청어일 수 있습니다. 귀하의 도구는 무언가가 고장 났다고 생각하게 만드는 트릭을 수행하고 있습니다.

파일 이름은 UTF-8 형식이므로 export LANG=en_US.UTF-8명령이 마찰 없이 파일 이름을 사용하도록 허용해야 합니다. 인수 없이 명령을 실행하여 locale현재 환경 변수를 확인합니다.

또는 "C" 로캘 사용을 고집하는 경우 ls -bls를 사용하여 물음표 대신 이스케이프 시퀀스를 인쇄하세요. 그런 다음 $'\353\266\204\…'Bash에서 매개변수로 사용할 수 있습니다 .

find명령은 tty에 텍스트가 아닌 문자를 쓰는 것을 소심하게 거부합니다. 즉, find동작이 find | cat다르고 후자는 따옴표 없이 이름을 쓰기 때문에 find | xargs작동하는 것입니다. 보다 안정적인 작성 방법은 find -print0 | xargs -0xargs가 가능한 공백 문자를 해석하지 못하도록 방지하는 것입니다.

이것은 "해당 파일이나 디렉터리가 없음"을 설명하지 않습니다. 어쨌든 귀하의 파일 시스템에 오류가 포함되어 있을 것입니다. 그러나 이를 통해 명령줄에 귀하의 의도를 더 정확하게 기술할 수 있습니다.

처음에는 이것이 관련이 없다고 생각했지만 ./명령이 파일 이름을 해석하지 못하도록 이상한 파일 이름 앞에 접두사를 붙이는 습관이 있습니다. 사이드바에는 관련 질문이 표시됩니다."rsync: 파일 이름의 콜론"이것이 rsync 오류의 근본 원인일 수 있습니다.

관련 정보