/ etc에서 "a"또는 "c"로 시작하는 파일을 나열하는 방법 [닫은]


10

시도 ls /etc/[ac]*했지만 " a "또는 " c "로 시작하는 파일이 아니라 a 또는 c로 시작하는 디렉토리와 전체 내용이 표시 됩니다.


디렉토리 는 여러 유형의 파일 중 하나입니다 . 어떤 유형의 파일 (일반, 심볼릭 링크, 장치, 파이프, 소켓 ...)에 관심이 있습니까?
Stéphane Chazelas

"디렉토리"가 디렉토리의 내용 이나 디렉토리 이름 자체에 대해 이야기하고 있는지 확실하지 않습니다 . 표시하는 명령은 패턴과 ls -d /etc/[ac]*일치하는 디렉토리의 내용을 나열하며 일치하는 디렉토리의 내용은 얻지 못하지만 디렉토리 이름은 계속 볼 수 있습니다. 이것이 원하는지 또는 디렉토리 이름을 나열하지 않으려는지 확실하지 않습니다.
Kusalananda

답변:


23

디렉토리의 내용을 나열하지 않으려면 다음을 수행하십시오.

ls -d /etc/[ac]*

디렉토리 이름a또는로 시작하는 일반 파일 이름 이 나열됩니다 c.

완벽을 기하기 위해 관련없는 솔루션 find은 다음과 같습니다.

ls -ld /etc/[ac]* | grep ^- | tr -s ' ' | cut -d' ' -f9

질문을 처음 읽었을 때도 ls -d적절 해 보였지만 원래 질문은 확장 또는 비 확장에 관계없이 디렉토리를 나열하지 않아야한다고 지정합니다.
Chris Down

1
ls -ld /etc/[ac]* | grep ^- | tr -s ' ' | cut -d' ' -f9파싱하지 마십시오 ls.
Avinash Raj

1
@AvinashRaj :이 조언의 관련성은이 솔루션이 한 번 또는 영원히 작동해야하는지 여부에 달려 있습니다. 한 번만 파싱하는 ls것은 제 생각에는 공정한 게임입니다.
Greg Hewgill

3
그는 요점이 있습니다. 의 이름은 /etc제정신 일 가능성이 매우 높지만 ls필드 번호가 변경되므로 간단한 공백으로 인해 접근 방식 이 중단 됩니다. ls -ld그래도 +1입니다 .
terdon

1
또한 로케일 ( LC_ALL=C) 을 수정해야하며 날짜는 다른 로케일에 3 개의 필드가 있다고 보장되지 않습니다.
Stéphane Chazelas

7

재귀 적으로 :

find /etc -type f -name '[ac]*'

비 재귀가 필요한 경우이 작업을 수행 할 수 있습니다.

find /etc/. ! -name . -prune -type f -name '[ac]*'

또는 이것은 이식성이 없습니다 (GNU 또는 최근 BSD 찾기).

find /etc -type f -maxdepth 1 -name '[ac]*'

이 대소 문자를 구분하지 않으려면 -iname대신을 사용하십시오 -name.


1
참고 -type f위한 일반 파일 . 디렉토리가 아닌 파일이 필요한 경우에는 ! -type d(또는 디렉토리에 대한 심볼릭 링크를 제외하려는 경우 ! -xtype dGNU로) 대체하십시오 find.
Stéphane Chazelas

1

이 명령을 시도해도됩니다

for file in /etc/[ac]*; do echo $file; done | xargs file | awk -v FS=" +" '$2~/directory/ {next;} {print $1}' | sed 's|\/etc\/||g;s/://g'

1

디렉토리의 내용이 아닌 디렉토리와 파일을 모두 원한다면 printfbultin 을 사용할 수 있습니다 .

printf "%s\n" [ac]*

예:

$ printf "%s\n" [te]*
examples.desktop
teamviewer_linux.deb
test.php
test.txt

질문에서 요청한 것처럼 디렉토리를 어떻게 피할 수 있습니까?
Chris Down

오, 내 오해 OP는 디렉토리는 원하지만 내용은 원하지 않는다고 생각합니다.
cuonglm

그 편집에 대해 죄송합니다. 완전히 잘못 읽었습니다.
terdon

1

재귀없는 find:

ls -pd /etc/[ac]* | grep -v '/$'

는 디렉토리 끝에 -pa /를 추가 하여 grep필터링합니다. 물론 개행과 같은 특수 문자가 포함 된 파일 이름에는 작동하지 않습니다.


1

zsh:

print -rl /etc/[ac]*(.)

대상 목록겠습니까 일반 (같이 파일 -type ffind나열된) /etc이름이 시작과 함께 a또는 c. (xxx)glob의 끝에 있는 부분은 globbing 한정 자라는 zsh 관련 기능입니다. .globbing 한정자로 일반 파일을 의미 합니다 .

글로브가 일치하지 않으면 zsh명령이 중단됩니다. 다른 Bourne과 같은 쉘에서 glob가 일치하지 않으면 패턴이 자체로 확장되므로 또는 로 시작하는 파일이 없으면 ls -d /etc/[ac]*호출 된 파일을 잘못 나열 할 수 있습니다./etc/[ac]*ac/etc

print -rl /etc/[ac]*(^/)

디렉토리 유형 이 아닌 파일을 나열 하고

print -rl /etc/[ac]*(-^/)

심볼릭 링크를 해결 한 후 디렉토리 유형이 아닌 파일을 나열합니다.


-3

a로 시작하는 표시 파일의 경우 :

ls etc |  grep ^a

c로 시작하는 파일을 표시하는 경우 :

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