$ find -exec cd => 오류 발생: => find: 'cd': 해당 파일이나 디렉터리가 없습니다.

$ find -exec cd => 오류 발생: => find: 'cd': 해당 파일이나 디렉터리가 없습니다.

이 명령을 실행하면 작동합니다.

$ find . -inum 888696 -exec ls '{}' \;
Conversation.pst  Outlook Data File  Outlook Data File.sbd  Trash      Unsent Messages
Inbox.pst     Outlook Data File.msf  Sent.pst       Trash.msf  Unsent Messages.msf

그러나 ls이를 cd대체할 때에는아니요일하다:

$ find . -inum 888696 -exec cd '{}' \;
find: ‘cd’: No such file or directory

나는 cd그것이 bash내장되어 있다는 것을 알고 있으므로 이것을 시도했습니다.아니요일하다:

$ find . -inum 888696 -exec builtin cd '{}' \;
find: ‘builtin’: No such file or directory

cd명령 과 함께 사용하는 방법은 무엇입니까 find -exec?


고쳐 쓰다

cd내가 with 를 사용하려는 이유 find -exec는 디렉토리 이름이 이상해서 내 터미널에 ????.

답변1

-execfind일부 명령줄 옵션 및 기타 매개변수를 사용하여 외부 유틸리티를 실행하는 옵션입니다 .

Unix는 cd외부 유틸리티를 제공하지 않고 내장 셸로만 제공하므로 find실행할 수 없습니다. 최소한 macOS 및 Solaris하다cd외부 유틸리티로 제공됩니다.

발견된 경로 이름이 들어갈 수 있는 디렉토리 cd인지 테스트하는 방법을 제외 하면 이 방법은 거의 쓸모가 없습니다 . 대화형 셸(또는 호출되는 모든 항목 )의 작업 디렉터리는 어쨌든 변경되지 않습니다.findcdfind

관련된:


이상하거나 입력하기 매우 어려운 디렉토리 이름에 문제가 있어 해당 디렉토리로 변경하려는 경우 디렉토리에 대한 기호 링크를 만든 다음 cd해당 링크를 사용하여 디렉토리에 들어가는 것을 고려하십시오.

find . -inum 888696 -exec ln -s {} thedir ';'

thedir이렇게 하면 문제의 디렉터리를 가리키는 기호 링크가 생성됩니다 . 그런 다음 다음 명령을 사용하여 작업 디렉터리를 변경할 수 있습니다.

cd thedir

(링크가 현재 디렉터리에 존재하는 경우) 이렇게 하면 어떤 방식으로든 디렉터리가 수정되는 것을 방지할 수 있습니다. 또 다른 아이디어는 유사한 방식으로 디렉토리 이름을 바꾸는 것입니다 find. 그러나 다른 프로그램에서 디렉토리가 특정 이름을 가질 것으로 예상하는 경우에는 권장되지 않습니다.

답변2

find명령 자체를 실행하면 -exec셸이 포함되지 않습니다. 그렇더라도 디렉토리에 대한 변경 사항은 쉘이 종료될 때까지만 지속됩니다(예: cd.

cd파일 이름 을 입력 하려면 현재 쉘에 파일 이름을 보내야 합니다 . 파일 이름이 얼마나 잘못된지에 따라 명령 대체를 사용할 수 있습니다.

cd "$(find . -inum 888696)"

명령 대체가 후행 개행 문자를 먹기 때문에 파일 이름이 개행 문자로 끝나는 경우에는 작동하지 않습니다. 이 경우 find인쇄할 때 줄 바꿈을 보호하고 추가된 줄을 제거 해야 합니다 .

dir=$(find . -inum 888696; echo x)
cd "${dir%?x}"

또는 GNU를 사용하여 find후행 개행을 인쇄하지 않도록 합니다(그러나 파일 이름의 개행은 여전히 ​​보호합니다).

dir=$(find . -inum 888696 -printf "%px" -quit)
cd "${dir%x}"

또한 -quit조건자(또한 GNU 확장)를 사용하여 최적화로서 첫 번째 일치에 집중하지 마세요.

또는 내에서 새 셸을 시작할 수 있지만 find이는 약간 보기 흉합니다.

find . -inum 888696 -exec bash -c 'cd "$1" && exec bash' sh {} \;

답변3

exec에서는 작동하지 않지만 이것으로 충분할 수 있습니다.

cd "$(find . -inum 888696 -type d)"

확실히 하기 위해 "-type d"를 사용합니다. 무엇에 관해서는, 나는 정말로 모른다.

답변4

이 메시지를 받았다면운영 체제 플랫폼에 문제가 있습니다.POSIX 표준에서는 명명된 명령이 cd전달되려면 파일 시스템에서 사용 가능해야 한다고 요구합니다 exec().

이제 나쁜 소식이 있습니다.

OS 플랫폼에 버그가 없더라도 경고는 표시되지 않지만 별도의 프로그램이 현재 작업 디렉터리를 변경한 다음 즉시 종료하는 경우 도움이 되지 않기 때문에 예상한 결과를 얻지 못합니다.

cd실행된 명령을 유효하게 하려면 find다음을 수행할 수 있습니다.

find . -type d -exec sh -c 'cd "$1"; some other command' dummy {} \;

관련 정보