답변:
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
find
뚱뚱한 짐승입니다.
“가난한 사람”에 관심이있을 수 있습니다 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\}'
세 개 이상의 /
문자가 포함 된 줄을 제거합니다 .
find
잘못 사용하는 방법이 있습니다 . 특히 달리기를하는 경우for file in $(find ...)
그중 하나를 공격했습니다).