찾기와 디렉토리 이름의 목록을 가져옵니다


35

디렉토리 이름 목록을 얻기 위해이 작업을 수행 할 수 있다는 것을 알고 있습니다.

find . -type d -maxdepth 1 

결과는 다음과 같습니다.

.
./foo
./bar

이없는 목록을 선호합니다 ./. 원시 이름 만 출력하는 방법이 있습니까?

형식을 지정하기 위해 목록을 통계로 보내려고했지만 동일한 결과를 얻습니다.

find . -type d -maxdepth 1 -print0 | xargs -0 stat -f '%N'

그래서 당신 은 앞에 foo bar ...한 줄에 모든 것을 ./원합니까?
Levon

이것은 순수하게 미용 / 미학적 이유로입니까, 아니면 출력으로 무언가를하려고합니까?
jw013

답변:


42

GNU find에서는 다음 -printf옵션을 사용할 수 있습니다 .

find . -maxdepth 1 -type d -printf '%f\n'

주석에서 Paweł가 언급했듯이 현재 디렉토리를 나열하지 않으려면 다음을 추가하십시오 -mindepth 1.

find . -mindepth 1 -maxdepth 1 -type d -printf '%f\n'

최신 POSIX 사양-printf 에서 옵션에 대한 언급을 찾을 수없고 그것이 얼마나 휴대 가능한지 궁금합니다.
rahmu

@rahmu : 이것은 GNU find로 테스트되었습니다. printfPOSIX 는 옵션을 언급하지 않았으며 다른 find버전에서는 지원되지 않는 것 같습니다 . GNU find는 대부분의 장소에 설치 될 수 있기 때문에 이식성이 뛰어납니다.
Thor

1
또한 추가 -mindepth 1당신이 제거하려는 경우.
파블 Prażak

18

최신 정보:

더 짧은 대안 :

 find . -maxdepth 1 -type d | cut -c 3-

슬래시없이 한 줄에 하나씩 이름을 줄 것입니다.


4
@downvoter .. 설명 없이 downvote 는 누구에게도 도움이되지 않습니다 (OP, SO 또는 저). 이것은 OP의 질문에 대한 기능적 솔루션입니다. 답변을 지적하거나 개선하면 오류를 수정하게되어 기쁘지만 익명의 "클릭"이 아닌 건설적인 피드백 이 필요합니다 .
Levon

1
귀하의 답변에 구문 분석이 포함되어있을 때 나는 다운 보트 한 사람 ls입니다. 동시에 나는 왜 이것이 삭제 된 다른 대답에 대한 나쁜 생각인지 에 대한 링크를 게시했습니다 . 당시에는 2 개의 답변 만 있었으며 그 이유는 분명해 보였습니다. 모호성을 지적 해 주셔서 감사합니다. 여기에 제 설명이 있습니다. 기록을 위해, 나는 당신의 현재 답변에 동의하기 때문에 공감대에서 공감대를 선회했습니다.
rahmu

@rahmu 다른 질문 에 당신의 downvote에 대한 설명을 하는 것은 나에게 도움이되지 않습니다 (그리고 당신에게 분명합니다). 또한 이것이 더 나은 솔루션이지만 이전에 게시 한 솔루션은 정상적으로 작동했습니다 (예, "ls를 사용하지 마십시오"링크에 익숙하지만 모든 경우에 맹목적으로 적용되는 것은 아닙니다). 초기 솔루션이 작동하지 않은 이유에 대한 반대의 예가 있다면, 실제로 알고 싶습니다 (그렇지 않으면 실제로 무언가를 배울 수 있습니다). 그렇지 않으면 링크를 게시하고 건설적인 것을 제공하지 않습니다.
Levon

거기 고려 \n하면 (내가 당신을을 downvoted 때 뭘하고 있었는지입니다)를 검색 할 컷을 사용할 수 없습니다 디렉토리 이름. ls위험한 행동을하지 않는 경우는 거의 없으며 다른 방법을 사용하는 것이 거의 항상 안전합니다.
rahmu

9

GNU find를 사용하면 -mindepth를 사용하여 find가 현재 디렉토리와 일치하지 않도록 할 수 있습니다.

find . -type d -maxdepth 1 -mindepth 1

이 작업을 재귀 적으로 수행하지 않기 때문에 bash glob을 사용할 수 있습니다.

echo */

glob에 후행 /를 추가하면 디렉토리 만 일치합니다.


1
*/도트 파일이 누락되고 심볼릭 링크가 포함됩니다. 이것은 문제 일 수도 있고 아닐 수도 있습니다.
Gilles 'SO- 악마 그만'

@Gilles-항상 심볼릭 링크가 누락되지만 도트 파일의 설정 여부에 따라 도트 파일이 달라집니다.
jordanm

6

하자 sed두 문자를 제거 :

find . -maxdepth 1 -type d | sed -e 's/^\.\///'


2

나는 보통 다음을 사용합니다.

find * -type d

그러나 그것이 당신이 원하는 것을하는 올바른 방법인지는 모르겠습니다.


1
쉘이 모든 파일 이름을 확장하게하려면 왜 find를 사용 하는가?
jordanm

@jordanm 디렉토리 만 선택합니다. echo */같은 일을 다소간에 수행하지만 (점 파일이 누락되고 심볼릭 링크가 포함되어 있음) joachim은 final 제거 방법을 묻습니다 /.
Gilles 'SO- 악마 그만'

0

AIX에서는 'maxdepth'매개 변수가 작동하지 않습니다.

일반적으로 이것은 나를 위해 작동합니다.

find ./ -type d | cut -d"/" -f2 | sort -u


0

당신이 찾고있는 것을이라고 basename합니다. 유닉스 디렉토리 구조를 무시합니다.

아래 예 :

find /any/path/you/want -maxdepth 1 -type d -exec basename {} \;

dir 경로조차도 출력을 제외 cd 하고 명령을 실행 하기 전의 필요성을 제거합니다.


일부 추가 정보 :

출력에 대한 다른 명령을 -exec대신 |(파이프) 찾기 위해 인수로 전달 합니다 (두 번째 명령을 피하는 것은 각 출력 행을 통과하여 출력에 따라 스크립트의 성능을 향상시킬 수 있다고 말했습니다)

참고 : find옵션은 위치아닙니다 (-maxdepth는 지정된 테스트와 그 뒤에 지정된 테스트에 영향을 미침).

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