
다음 이름을 가진 모든 파일을 삭제해야 합니다(따옴표는 이름의 일부입니다).
'index.html?some-query-string'
나는 다음을 시도했다:
rm \'index.html?*\'
다음 오류가 발생합니다.
rm: cannot remove ''\''index.html?*'\''': No such file or directory
답변1
분석
따옴표는 이름의 일부입니다.
확실합니까? 어떻게 알 수 있나요? 이것이 있다현대 GNU의 "특징"ls
?
, 따라서 inside 와 같은 문자가 있는 경우 추가 따옴표와 함께 이름을 인쇄합니다 . 따라서 일반 일반인이 복사하여 붙여넣고 'index.html?some-query-string'
실행 하면 rm 'index.html?some-query-string'
이것이 올바른 안전 명령이 될 것입니다.
불행하게도 이는 일부 문자를 인용하거나 이스케이프 처리해야 한다는 것을 알고 있는 좀 더 능숙한 사용자에게 혼란을 줄 수 있습니다. 귀하의 rm
명령 ( rm \'index.html?*\'
)은 따옴표가 있는 이름에 적합합니다. ?*
glob 패턴이기 때문에 더 많은 파일 이름과 일치할 수 있습니다 . 나는 당신이 "모든 파일을 삭제해야 합니다"라고 썼기 때문에 이것이 당신이 원하는 것이라고 가정합니다. 명령이 제공했다는 사실로 No such file or directory
인해 기존 이름이 실제로 다르다고 믿게 되었습니다.
이를 확인하려면 를 실행하세요 ls -N
. 이 명령이 성공하고 다음과 같은 이름을 인쇄하면index.html?some-query-string
인용없이그 다음에이것들실제 이름입니다.
해결책
답변의 이 부분은 귀하가 ls
최신 GNU ls
이거나 이와 유사하게 "스마트"하다고 가정하므로 문제의 인용문은 파일 이름에 속하지 않습니다.
특정 파일을 제거하려면 'index.html?some-query-string'
"smart" 출력을 보는 완전한 평신도 역할을 ls
하거나 . 달리다:index.html?some-query-string
ls -N
rm 'index.html?some-query-string'
또는 이름이 다음으로 시작하는 모든 파일을 제거하려는 경우 index.html?
:
rm 'index.html?'*
쉘은 따옴표를 제거하지만 rm
. 작은따옴표는 ?
와일드카드로 처리되지 않고 문자 그대로 전달됩니다 rm
. 따옴표가 없는 문자는 *
와일드카드로 처리되어 모든 쿼리 문자열과 일치하며, 쉘은 일치하는 여러 파일 이름을 인수로 에 전달합니다 rm
.
답변2
'
파일 이름의 일부인 경우 find 명령을 사용하여 " "
명령에 대한 이름 패턴을 전달하는 것이 좋습니다.
사용할 수 있는 예는 다음과 같습니다.
find . -maxdepth 1 -type f -name "'index.html?*'" -exec rm {} \;