Fish를 쉘로 사용하는 동안 다음을 사용하여 현재 디렉토리에 있는 여러 C 소스 파일에 대한 권한을 설정하려고 합니다.
find . -type f -name "*.c" -exec chmod 644 {} +;
오류가 발생했습니다.
찾기: '-exec' 인수 누락
또는
find . -type f -name "*.c" -exec chmod 644 {} \;
오류가 발생했습니다.
chmod: ''에 접근할 수 없습니다: 해당 파일이나 디렉터리가 없습니다
뭐가 문제 야?
답변1
fish
일이 일어난다{}
인용이 필요한 몇 안되는 쉘 중 하나.
따라서 해당 셸을 사용하려면 다음이 필요합니다.
find . -type f -name '*.c' -exec chmod 644 '{}' +
따옴표가 없으면 {}
빈 매개변수로 확장되므로 명령은 다음과 같습니다.
find . -type f -name '*.c' -exec chmod 644 '' +
그리고 find
누락에 대해 불평합니다 {}
(또는 을 ;
따를 때만 +
종결자로 인식됩니다 ).-exec
{}
대부분의 다른 쉘에는 {}
.
답변2
{
낚시 에는 }
특별한 의미가 있습니다 . 사용하려면 먼저 이스케이프해야 합니다 find
. 예를 들면 다음과 같습니다.
find . -type f -name "*.c" -exec chmod 644 \{\} \;
{}
아니면 이런 말을 인용해야 합니다 .
find . -type f -name "*.c" -exec chmod 644 '{}' \;
답변3
귀하의 예에 예상되는 후행 세미콜론이 누락되었습니다.
find . -type f -name "*.c" -exec chmod 644 {} \;
질문을 수정해보니 "물고기" 껍데기 입니다. 이는 알려진 문제이며 @rahul이 언급한 인용문을 사용하여 해결할 수 있습니다. 그러나 제안된 이스케이프는 내 구성에서는 작동하지 않습니다. 작은따옴표는 다음과 같습니다.
find . -type f -name "*.c" -exec chmod 644 '{}' \;
find . -type f -name "*.c" -exec chmod 644 '{}' +
무엇하다(잘라내기/붙여넣기 대신 문자를 입력하는 경우) 중괄호를 이스케이프 처리하기 위해 명령줄을 편집하려고 할 때 발생합니다.물고기혼란스러워서 진행할 수 없습니다. 다음은 백슬래시를 삽입한 후의 스크린샷입니다(잘라내기/붙여넣기를 시도할 필요 없음).저것):
그런 다음 Enter 키를 누릅니다.
그래서아니요, 피쉬는 실제로 이스케이프된 중괄호와 함께 작동하지 않습니다. 그런 척만 할 뿐입니다. 계속해서 눌러 enter최종적인 시연을 해보세요.
추가 자료: