파일을 찾은 다음 해당 파일이 포함된 디렉터리로 이동하고 싶습니다. 노력했지만 find /media/storage -name "Fedora" | xargs cd
물론 is not a directory
실수도 했습니다.
한 줄의 명령으로 상위 디렉터리에 어떻게 들어갈 수 있나요?
답변1
적어도 GNU가 있다면 다음을 사용하여 디렉토리를 얻을 find
수 있습니다 .-printf '%h'
%h Leading directories of file's name (all but the last ele‐
ment). If the file name contains no slashes (since it is
in the current directory) the %h specifier expands to
".".
그래서 당신은 아마 할 수 있습니다
cd "$(find /media/storage -name "Fedora" -printf '%h' -quit)"
여러 파일이 일치하는 경우 -quit
여러 인수를 사용하지 않아야 합니다 .cd
답변2
~처럼스틸 드라이버솔루션이지만 결합되어 있습니다 -execdir
( find
지원하는 경우(예: GNU 또는 FreeBSD)):find
pwd
cd "$(find /media/storage -name "Fedora" -execdir pwd \; -quit)"
-quit
결과가 하나뿐이고 전체 디렉터리를 크롤링하는 데 문제가 없는 경우 선택 사항입니다. NetBSD에는 존재 -exit
하지만 OpenBSD에는 존재하지 않습니다.
답변3
find가 찾은 디렉토리에서 새 쉘을 실행하도록 지시할 수 있습니다.
exec find /media/storage -name "Fedora" -execdir "$SHELL" \;
, 현재 디렉터리는 Fedora라는 파일이 포함된 디렉터리가 됩니다. ;)
분명히 이는 대화형으로 명령을 입력하는 경우에만 원하는 것과 비슷한 작업을 수행할 것입니다.
답변4
이 문제를 해결하는 방법과 작동하는 것을 얻는 방법을 보여주는 많은 답변이 이미 있습니다. 그러나 처음부터 왜 그것이 작동하지 않는지 아무도 말하지 않았습니다.
그렇기 때문에 달리기가 xargs cd
작동하지 않습니다.
이는 디렉터리를 변경하는 스크립트를 작성하는 것과 동일한 문제입니다.
xargs
새 프로세스에서 실행할 새 프로세스/스크립트를 시작합니다.cd
이 새 프로세스의 현재 작업 디렉터리를 변경합니다.- 새 프로세스가 종료됩니다.
따라서 더 이상 존재하지 않는 프로세스의 현재 작업 디렉터리가 변경되었습니다.
그런 다음 cd
내장 명령을 사용하는 셸에서 이를 호출합니다. 새로운 프로세스를 생성하지 않습니다. 이러한 방식으로 쉘 프로세스의 현재 작업 디렉토리가 변경됩니다.
무엇을 해야할지 알아 보려면 다른 답변을 참조하십시오.