이름이 같은 모든 디렉토리에서 서브 디렉토리 찾기


8

다음과 같은 명령을 실행하고 싶습니다.

  1. " inc"폴더에서 " X" 라는 이름의 모든 디렉토리를 찾으십시오 .
  2. 각 " X/.../inc/" 아래에 모든 하위 디렉토리를 나열하십시오 .
  3. 출력을 " list" 파일로 리디렉션

성공하지 않고 아래 명령의 다양한 조합을 시도했습니다.

$ find X/ -name "inc" -print | xargs find {} -type d > list
find: path must precede expression

어떻게해야합니까?

답변:


13

find 이 모든 것을 스스로 할 수 있습니다.

find X -path '*/inc/*' -type d > list

자세한 내용은 -path부분을 읽으십시오 man find.

주석에서 빠르게 언급했듯이 디렉토리 줄을 텍스트 파일로 구분하여 저장하면 줄 바꿈이 포함 된 디렉토리 이름을 명확하게 표현할 수 없습니다. 당신이 경우 특정 디렉토리 괜찮아 그, 줄 바꿈을 포함하지 않는다. 일반적인 말입니다.


네. 나는 같은 대답을했다 여기에
왕자 존 웨슬리에게

또는 X -name '
inc'

@MaQleod : 아니요, 문제는 아닙니다.
Daniel Andersson

4

다음은 편리한 단일 라이너입니다.

find X -type d -name "inc" -exec sh -c 'find {} -type d' \; > list

find첫 번째 find결과 각각에서 실행됩니다 . 이 exec옵션은 최소한의 쉘 명령을 취할 수 있습니다. 앞에서 언급 {}했듯이 첫 번째의 각 디렉토리로 바뀝니다 find.

두 번째 find는 요청에 따라 inc디렉토리를 포함하여 첫 번째 결과의 "모든 하위 디렉토리를 나열합니다" . 출력에서 그 자체를 원하지 않으면 두 번째 find 깊이 1의 출력 폴더를 두십시오 .

find X -type d -name "inc" -exec sh -c 'find {} -mindepth 1 -type d' \; > list

그런 다음 명령을 stdout로 리디렉션합니다 list.


난 단지 원래 경기 깊이 1 서브 디렉토리 싶었던 그 대답에 변화는 나에게 도움이되었다 find path -name inc -type d -exec sh -c 'find {} -mindepth 1 -maxdepth 1 -type d' \;
코어

1

이 중첩 된 찾기를 시뮬레이트하는 대답을 찾았습니다.

find X/ -type d | grep "/inc/" > list

좋아요, 저것도 작동합니다! 그러나, 유닉스 / 리눅스 쉘에서, 정말 같은 것은 없다 대답. 개인적인 취향과 따르기 쉬운 것이 혼합되어 있습니다.
Vishal Kotcherlakota

예를 들어, 줄 바꿈과 틀에 얽매이지 않는 (그러나 기존) 파일 이름을 돌봐 : find X/ -type d -print0 | awk 'BEGIN{RS="\0"}/\/inc\//' > list( grep -z또한 그럼 하나의 예를 통해 파이프에 필요, 널 문자를 구분합니다,하지만 출력이 null뿐만 아니라 분리 된 것으로 보인다 xargs -0L1 echo는 선으로 줄을 얻기 위해 ). 이 경우 모든 항목을 개행 문자로 구분하여 목록을 파일로 저장하므로 파일 이름의 개행 문자는 여전히 명확하게 표현됩니다. 목록으로 수행하려는 작업에 따라 중간 파일이 필요하지 않을 수도 있습니다.
Daniel Andersson

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.