find -exec가 물고기에서 작동하지 않습니다

find -exec가 물고기에서 작동하지 않습니다

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최종적인 시연을 해보세요.

qed

추가 자료:

관련 정보