특정 하위 폴더가 있는 모든 디렉터리 경로를 찾아야 합니다.
검색 패턴은 다음과 같습니다.
find /foo/*/searched_folder/bar -maxdepth 0 -type d
―i―t―의―s――――u―s―s―e―e―t―h―i―s―s―a―l―s―s―a―r―t―. ―. ―f-i-r-s-t-e-n-t-r-y-,--t-h-e-p-r-o-g-r-a-m-s-t-o-p-s-s-e-a-r-c-h-i-n-g-a-n r ut y . I̶ ̶w̶a̶s̶ ̶t̶r̶y̶i̶n̶g̶ ̶t̶o̶ ̶u̶s̶e̶ ̶o̶p̶t̶i̶o̶n̶ -prune
b̶u̶t̶ ̶w̶i̶t̶h̶o̶u̶t̶ ̶s̶u̶c̶c̶e̶s̶s̶.̶ ̶I̶s̶ ̶t̶h̶e̶r̶e̶ ̶a̶n̶y̶ ̶e̶x̶t̶r̶a̶ ̶a̶r̶g̶u̶m̶e̶n̶t̶ ̶t̶o̶ ̶s̶e̶a̶r̶c̶h̶ ̶t̶h̶o̶s̶e̶ ̶f̶o̶l̶d̶e̶r̶ ̶p̶a̶t̶h̶s̶,̶ ̶o̶r̶ ̶m̶a̶y̶b̶e̶ ̶t̶h̶e̶r̶e̶ ̶i̶s̶ ̶s̶o̶m̶e̶ ̶o̶t̶h̶e̶r̶ ̶w̶a̶y̶ ̶t̶o̶ ̶s̶e̶a̶r̶c̶h̶ ̶i̶t̶?̶ ̶
특정 패턴과 일치하는 디렉터리를 찾아 경로 배열로 bash 스크립트에 통합하고 싶습니다. 검색을 제외한 모든 것이 잘 작동합니다.
SORCE_ARRAY=($(find /projekte/*/$AB/software/software.git/ -maxdepth 0 -type d))
실제 예
find /projekte/*/3140/software/software.git/ -maxdepth 0 -type d
새 버전(openSUSE Tumbleweed):
/projekte/ABBA/3140/software/software.git/
/projekte/JERRY/3140/software/software.git/
/projekte/LED/3140/software/software.git/
이전 버전(openSUSE Leap 15.1):
/projekte/ABBA/3140/software/software.git/
고쳐 쓰다
문제는 소프트 링크입니다. Linux openSUSE Tumbleweed의 구조는 서버의 소프트 링크인지 일반 폴더인지 구분하지 않습니다. 폴더가 3개 있는줄 알았는데 마지막 2개의 결과가 소프트링크였습니다.
한편, openSUSE Leap에서는 다른 문제가 있습니다. 첫째, 거의 모든 실제 폴더가 먼저이므로 find가 더 이상 검색되지 않을 것 같습니다. 둘째, 서버에서 소프트 링크의 경로는 다음과 같습니다.
/projekte/*/3140/software/software.git/
하지만:
/projects/*/3140/software/software.git/
이는 모든 시스템 프로그램("찾기"뿐만 아니라)에서 읽을 수 없습니다.
결론은 이렇습니다.
- Tumbleweed는 해당 폴더가 소프트 링크인지 폴더인지 표시하지 않습니다.
- Leap이 소프트 링크를 올바르게 해석할 수 없습니다.
나는 아직도 이 두 가지를 어떻게 결합해야 할지 모르겠습니다.
답변1
패턴과 일치하는 모든 이름을 찾으려면 /projekte/*/3140/software/software.git/
다음을 수행하십시오.
set -- /projekte/*/3140/software/software.git/
그런 다음 위치 매개변수에서 이러한 이름을 사용할 수 있습니다.
for gitdir do
printf 'Found directory %s\n' "$gitdir"
done
그렇지 않으면
printf 'Found directory %s\n' "$@"
그러면 찾은 디렉터리의 이름이 인쇄됩니다. 이름이 디렉토리에 대한 심볼릭 링크인 경우 심볼릭 링크가 순회됩니다.
다음과 같이 명명된 배열에 할당해야 하는 경우 bash
:
set -- /projekte/*/3140/software/software.git/
SORCE_ARRAY=( "$@" )
그렇지 않으면
SORCE_ARRAY=( /projekte/*/3140/software/software.git/ )
명령 대체는 파일 이름의 공백을 유지하지 않기 때문에 확장된 명령 대체보다 선호되는 방법입니다.
유일한 문제는 패턴이 일치하지 않는 경우입니다.아무것이 경우 모드는 확장되지 않은 상태로 유지됩니다. 일치하지 않는 패턴이 완전히 확장되지 않도록 하려면 shopt -s nullglob
쉘에서 를 사용하세요 bash
.
답변2
head
find
다음과 같이 파이프를 통해 명령을 사용해야 합니다 find /foo/*/searched_folder/bar -maxdepth 0 -type d | head -n 1
. 이렇게 하면 첫 번째 결과만 얻을 수 있습니다.