왠지 파일 이름에 캐리지 리턴(\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