파일 이름에 캐리지 리턴(\r)이 포함된 파일을 어떻게 찾고 삭제합니까?

파일 이름에 캐리지 리턴(\r)이 포함된 파일을 어떻게 찾고 삭제합니까?

왠지 파일 이름에 캐리지 리턴(\r)이 포함된 파일을 생성하는 것 같습니다.

$ ls -1 tri-rods.tm.dat*
tri-rods.tm.dat
'tri-rods.tm.dat'$'\r'
$ ls tri-rods.tm.dat?
'tri-rods.tm.dat'$'\r'

"\r"로 검색을 시도했지만 아무것도 찾지 못했습니다.

$ find . -type f -name '*\r'

그러한 파일을 어떻게 나열/찾고 삭제할 수 있습니까? 파일 이름에 "?"를 추가하면 하나씩 삭제할 수 있지만 보다 일반적인 접근 방식을 선호합니다.

참고: Windows에서 Cygwin/git-bash/Linux용 Windows 하위 시스템을 통해 이 작업을 수행하려고 하므로 일부 명령이 예상대로 작동하지 않을 수 있습니다.

답변1

-name테스트에는 쉘 glob이 필요하고 glob은 이에 대해 모르기 때문에 아무것도 발견하지 못했습니다 \r. Cygwin 쉘이 $' '기호를 지원한다고 가정하면 다음을 수행할 수 있습니다.

find . -name '*'$'\r''*'

따라서 삭제하려면 다음을 수행할 수 있습니다.

find . -name '*'$'\r''*' -delete

또는 find해당 작업이 없으면 -delete다음을 사용하십시오.

find . -name '*'$'\r''*' -exec rm {} +

-regex테스트가 최선의 선택인 것 같지만 불행하게도 정규식 스타일 중 어느 것도 find백슬래시 문자 이스케이프 이해를 지원하지 않습니다(또한이 답변):

$ find . -regextype findutils-default -regex '.*\r.*'
$ find . -regextype ed -regex '.*\r.*'
$ find . -regextype emacs -regex '.*\r.*'
$ find . -regextype gnu-awk -regex '.*\r.*'
$ find . -regextype grep -regex '.*\r.*'
$ find . -regextype posix-awk -regex '.*\r.*'
$ find . -regextype awk -regex '.*\r.*'
$ find . -regextype posix-basic -regex '.*\r.*'
$ find . -regextype posix-egrep -regex '.*\r.*'
$ find . -regextype egrep -regex '.*\r.*'
$ find . -regextype posix-extended -regex '.*\r.*'
$ find . -regextype posix-minimal-basic -regex '.*\r.*'
$ find . -regextype sed -regex '.*\r.*'

첫 번째 것만이 $'\r'나를 위해 일했습니다.

$ find . -name '*'$'\r''*'
./bad?file

관련 정보