내가 입력하면 :
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
감사
답변
출력 변경 없이는 가능하지 않지만 다음은 쉬운 대안입니다.
find source/ -type f
또는 (GNU 찾기에만 해당) 질문에 깊이있는 파일 만 가져옵니다.
find source/ -type f -mindepth 2 -maxdepth 2
(또는 당신이 같은 디렉토리를 원한다면 ls
제거하십시오 -type f
)
답변
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
.
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\}'
세 개 이상의
/
문자가 포함 된 줄을 제거합니다 .