이 명령을 실행하면 작동합니다.
$ 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
-exec
find
일부 명령줄 옵션 및 기타 매개변수를 사용하여 외부 유틸리티를 실행하는 옵션입니다 .
Unix는 cd
외부 유틸리티를 제공하지 않고 내장 셸로만 제공하므로 find
실행할 수 없습니다. 최소한 macOS 및 Solaris하다cd
외부 유틸리티로 제공됩니다.
발견된 경로 이름이 들어갈 수 있는 디렉토리 cd
인지 테스트하는 방법을 제외 하면 이 방법은 거의 쓸모가 없습니다 . 대화형 셸(또는 호출되는 모든 항목 )의 작업 디렉터리는 어쨌든 변경되지 않습니다.find
cd
find
관련된:
이상하거나 입력하기 매우 어려운 디렉토리 이름에 문제가 있어 해당 디렉토리로 변경하려는 경우 디렉토리에 대한 기호 링크를 만든 다음 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 {} \;