배쉬 : ls * 폴더 그룹화 안함


12

내가 입력하면 :

ls source/*

source/fonts:
fontello

source/images:
bg1.png                eng.png        fra.png   

폴더 이름별로 그룹화 된 파일 목록을 얻습니다. 단순히 파일 이름 목록을 얻는 방법은 무엇입니까?

ls source/*

source/fonts/fontello
source/images/bg1.png
source/images/eng.png
source/images/fra.png   

감사


이것이 스크립팅 용인 경우 mywiki.wooledge.org/ParsingLs 를 참조하십시오 . (즉, find잘못 사용하는 방법이 있습니다 . 특히 달리기를하는 경우 for file in $(find ...)그중 하나를 공격했습니다).
Charles Duffy

답변:


13

출력 변경 없이는 가능하지 않지만 다음은 쉬운 대안입니다.

find source/ -type f

또는 (GNU 찾기에만 해당) 질문에 깊이있는 파일 만 가져옵니다.

find source/ -type f -mindepth 2 -maxdepth 2

(또는 당신이 같은 디렉토리를 원한다면 ls제거하십시오 -type f)


5

psychedlics ( ls -d) 를 추가하면 간단히 ls를 고수 할 수 있습니다 .

# mkdir test
# cd test
# mkdir A B C
# touch {A,B,C}/file*
# ls -d */*    
A/file  B/file  C/file

@Cthulhu ok 예제가 너무 짧습니다. A, B a / o C에 폴더가 있으면 -d는 선택한 항목 만 표시하는 데 도움이됩니다. 실제로 못 했습 좋아해요 당신은 LS와 인수에 의해 깊이가 -d 정의 할 수 있습니다
ikrabbe

깊이를 제한하기 위해 다른 답변에 대한 편집을 제안했습니다.
o11c

@ o11c는 매우 좋지만 여전히 find뚱뚱한 짐승입니다.
ikrabbe

3

“가난한 사람”에 관심이있을 수 있습니다 find.

shopt -s globstar

shopt -s 명명 된 쉘 옵션 (들) ETS. globstar에서 다음과 같이 옵션을 정의 bash는 (1) :

설정 **하면 파일 이름 / 경로 확장 컨텍스트에 사용 된 패턴 은 파일 [sic] 및 0 개 이상의 디렉토리 및 하위 디렉토리와 일치합니다 . 패턴 다음에가 오는 /경우 디렉토리와 하위 디렉토리 만 일치합니다.

따라서을 완료 한 후 shopt -s globstar다음 명령 중 하나를 수행 하십시오.

ls -d1-source / **                  # 'd'다음의 문자는 숫자입니다. 
ls -d-소스 / ** | cat             # 즉, 모든 명령에 대한 파이프에 작성합니다. 
printf "% s \ n"소스 / **

출력을 생성합니다 :

source/
source/fonts
source/fonts/fontello
source/images
source/images/bg1.png
source/images/eng.png
source/images/fra.png

불행히도 여기에는 디렉토리 이름도 포함됩니다. 그것을 아는 것이 조금 도움이 될 수 있습니다 .

printf "%s\n" source/**/

출력을 생성합니다 :

source/
source/fonts
source/images

즉, 디렉토리 이름 . 당신은 하나 개의 파일에 명령의 첫 번째 세트 중 하나의 출력을 리디렉션 두 번째 파일에 위의 출력을 리디렉션 한 다음 사용할 수 있습니다 comm, diff또는 이와 유사한 만 일반 떠나, 처음부터 두 번째 파일을 뺄 파일 (비 디렉토리). 그러나 그렇게하지 마십시오.

또 다른 접근법 ( 별로 좋지는 않음 )은

ls -d --file-type -- source/** | grep -v '/$'

--file-type옵션은 다음 과 같이 각 디렉토리 이름의 끝에 a와 다른 (특수) 파일 유형의 끝에 다른 문자 ls를 표시하도록 지시 합니다 /.

source //                             # 하나 더 추가 
source / fonts /                        # 하나 추가
소스 / 글꼴 / 폰텔로
소스 / 이미지 /                       # 하나 추가
출처 / 이미지 /bg1.png
source / images / eng.png
출처 / 이미지 /fra.png

그런 다음로 grep -v '/$'끝나는 줄을 제거합니다 /. 즉, 디렉토리 이름. 불행히도, --file-type옵션은 POSIX에 의해 지정 되지 않았습니다 . 의 버전에서 ls지원하지 않는 경우를 사용하십시오 -F. 즉처럼 --file-type 그것도 표시를 제외하고 *어떤 사람들은 성가신 찾아 실행 파일의 이름의 끝에서. 다음과 sed같이 제거 할 수 있습니다 .

ls -dF -- source/** | sed -e '/\/$/d' -e 's/\*$//'

모든 파일 (및 파일 만)로 무언가를하고 싶다면 할 수 있습니다

소스에서 f의 경우 **
하다
    [-f "$ f"] 인 경우
    그때
        일반 파일에 적용 할 명령을 여기에 삽입하십시오.
    fi
끝난

노트:

  • 경우 ls단자에 출력하고, 그것의 아니다된다 -l( 리터 옹) 모드 (이름이 매우 긴 아니라면)는 라인 당 여러 이름을 기록한다. -1(1) 을 지정 하거나 출력을 파일 또는 파이프로 경로 재지 정하여 한 줄에 하나의 이름을 쓰도록 강제 할 수 있습니다 .
  • 내용을 만든 디렉토리를 나열하므로 명령 --에 실제로 필요하지 않을 ls것입니다. *알 수없는 디렉토리에 나열 할 때는 로 시작하는 파일 이름으로부터 보호해야합니다 -.
  • 의 출력을 구문 분석하지 마십시오 ls.
  • globstar쉘 옵션은 POSIX에 의해 정의되지 나타납니다. (사실, 난 POSIX 인식 확실하지 않다 어떤 쉘 옵션을.) 그것은 것 같다하지만 bash조심,주의 - 그것은 배쉬의 모든 버전에 존재하지 않을 수도 있습니다.
  • 하위 디렉토리가 fonts있거나 images하위 디렉토리가있는 경우 **모든 하위 디렉토리를 재귀 적으로 나열합니다. 깊이를 제한하는 하나의 (어떻게 클루 지하고 신뢰할 수없는) 방법은

    ls -d --file-type -- source/** | grep -v '\(/.*\)\{3\}'
    

    세 개 이상의 /문자가 포함 된 줄을 제거합니다 .

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