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


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.