이름이 작은따옴표로 시작하는 모든 파일을 제거합니다.

이름이 작은따옴표로 시작하는 모든 파일을 제거합니다.

다음 이름을 가진 모든 파일을 삭제해야 합니다(따옴표는 이름의 일부입니다).

'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-stringls -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 {} \;

관련 정보