현재 디렉토리의 일반 파일 만 표시 (디렉토리 제외)


126

ls -ld */현재 디렉토리의 모든 디렉토리 항목을 나열 하는 데 사용할 수 있습니다 . 현재 디렉토리의 모든 일반 파일을 나열하는 비슷한 방법이 있습니까? 찾기를 사용할 수 있다는 것을 알고 있습니다

find . -maxdepth 1 -type f

또는 통계

stat -c "%F %n" * | grep "regular file" | cut -d' ' -f 3-

그러나 이것들은 지나치게 우아하다고 생각하지 않습니다. 일반 파일 (장치, 파이프 등은 신경 쓰지 않음) 만 나열하고 현재 디렉토리의 하위 디렉토리는 나열하지 않는 좋은 방법이 있습니까? 심볼릭 링크를 나열하는 것도 장점이지만 필수는 아닙니다.


5
"과도하게 우아하다"는 무슨 뜻입니까? 내가 아는 한, find명령은 원하는 것을 수행하는 가장 좋은 방법입니다. 신뢰할 수있는 다른 옵션의 경우, 쉘 특정 명령을 살펴 봐야합니다 (이것은 이식 가능하지 않은 명령입니다)!
rahmu

@rahmu 나는 ls -d */짧고 입력하기 쉽고 이해하기 쉬운와 비슷한 것을 원했습니다 . zsh를 사용하지 않더라도 Ulrich Dangel의 답변에 매우 만족합니다.
다니엘 쿨만

답변:


32

Glob 한정자 를 사용하면 다음 zsh과 같이 직접 직접 표현할 수 있습니다.

echo *(.)

구성에 따라 일반 파일 목록 또는 오류 만 반환합니다.

비 디렉토리의 경우 :

echo *(^/)

(심볼 (디렉토리 포함), 명명 된 파이프, 장치, 소켓, 문 포함)

echo *(-.)

일반 파일 및 일반 파일에 대한 심볼릭 링크

echo *(-^/)

디렉토리가 아닌 디렉토리에 대한 심볼릭 링크도 없습니다.

또한, 참조 D포함 할 경우 대체 (globbing) 규정을 D 해주 파일 (숨김 파일)처럼 *(D-.).


170
ls -p | grep -v / 

이 명령은 디렉토리가 아닌 숨겨지지 않은 모든 파일 (일반 파일, 링크, 장치 파일 등)을 나열합니다 . 숨겨진 파일도 포함 시키려면 -A옵션을 추가하십시오.ls

파일 이름에 개행 문자가없는 것으로 가정합니다. 줄 바꿈을 포함하여 인쇄 할 수없는 모든 문자를로 변환 하는 -q옵션을 추가하면 한 줄로 표시되므로 터미널 기반 유틸리티와 같은 줄 기반 유틸리티에 공급 하거나 터미널에 인쇄 하는 데 적합합니다 .ls?grep


14
+1, 이것은 좋은 대답입니다. 코멘트가없는 새로운 사용자 투표는 특히 충격적인 답변을 제공 할 때 매우 충격적입니다. 이것이 제대로 작동하지 않는 유일한 사례는 파일 이름에 줄 바꿈이있는 경우입니다. 또한 지원되는 경우 색상을 유지하는 것이 좋습니다. GNU를 들어 당신은 추가 할 수 있습니다 --color=always받는 lsOSX를 들어, -G.
Graeme

안녕하세요, 당신이 제공 한 명령은 훌륭하고 확실히 나를 도와줍니다. 그러나 위의 명령을 사용하고 동시에 파일 권한을 변경할 수 있는지 궁금합니다. 나는에 추가하는 시도 sudo chmod 777어떤 도움이 크게 감사합니다 ... 끝에서, 나는 오류를 받았다
dissidia

3
디렉토리를 가리키는 심볼릭 링크도 제외하려면 ls -pL | grep -v /. 추가 된 -L심볼릭 링크를 역 참조합니다.
Matthias Braun

1
와일드 카드 필터를 사용하려면을 수행하십시오 ls -pdL something* | grep -v /. 추가 된 -d옵션은 내용이 아니라 디렉토리 자체를 나열하므로 올바르게 제외됩니다.
Rockallite

그리고 폴더없이 모든 파일을 가져
오려면

23

일반 파일 만 나열하려면

ls -al | grep '^-'

모든 유형의 파일에 대한 심볼릭 링크 포함 :

ls -al | grep '^[-l]'

목록의 첫 번째 문자가 파일 유형을 설명하므로 -기호 링크의 경우 일반 파일임을 의미합니다 l.

데비안 / 우분투

일치하는 모든 파일 (링크 포함)의 이름을 인쇄하십시오.

run-parts --list --regex . .

절대 경로로 :

run-parts --list --regex . "$PWD"

다음으로 /etc시작 p하고 끝나는 모든 파일의 이름을 인쇄하십시오 d.

run-parts --list --regex '^p.*d$' /etc

15

lsunix & linux의 좋은 점 중 하나는 오래되고 우아하지 않은 파이프 라인을 쉘 스크립트, 함수 또는 별칭으로 쉽게 바꿀 수 있다는 것입니다. 이것들은 다른 프로그램과 마찬가지로 파이프 라인에서 사용될 수 있습니다.

(참고 : 함수 및 별칭과 관련하여 일부 범위 문제가 있습니다. 스크립트를 읽고 실행할 수있는 모든 실행 파일에서 스크립트를 사용할 수 있습니다. 별칭 및 함수는 현재 셸에서만 사용 가능합니다. 하위 셸의 .profile / .bashrc 등은 재정의 될 수 있습니다) 또한 bash / sh, awk, perl, python 등을 포함한 모든 언어로 스크립트를 작성할 수 있습니다 (작업에 가장 적합하거나 가장 친숙한 언어)

예 :

alias lsf='find . -maxdepth 1 -type f -print0 | xargs -0r ls'

나는 모든 일반적인 ls옵션을 사용할 수 있도록 xargs를 추가했다.lsf -lrS

을 사용하기 때문에 find일반적으로 숨겨져있는 모든 점 파일이 표시되고 모든 파일 이름 앞에 ./-접두사가 붙습니다.

도트 파일을 제외 할 수는 ! -iname '.*'있지만 두 가지 버전의 별칭이 있어야합니다. 하나는 도트 파일을 표시하고 다른 하나는 그렇지 않은 것입니다.

alias lsf2='find . -maxdepth 1 -type f -a ! -iname '\''.*'\'' -print0 | xargs -0r ls'

또는 lsf별칭이 아닌 스크립트 인 경우 옵션 (예 : getopts 또는 / usr / bin / getopt 또는 이와 유사한 것)을 구문 분석하고 -a존재 하지 않는 한 도트 파일을 제외 할 수 있습니다.


-name충분합니다 -iname. 필요하지 않습니다 .
Totor

8
bash-4.2$ ls -F | grep -v '[/@=|]$' | more

ls의 -F 옵션은 *를 실행 파일, /에, @를 기호 링크에, =를 소켓에 추가하고 | FIFO에게. 그런 다음 grep을 사용하여 비정규 파일 문자를 출력에서 ​​제외하고 파일을 가질 수 있습니다. 이것은 zsh뿐만 아니라 모든 쉘에서 작동합니다.

약점은 다음과 같습니다.

  1. 그의 이름은 모든 파일의 종료 @, =또는 |제외됩니다 (하지만 당신은 정말 어쨌든 이름에 이러한 문자와 파일이 안된다)
  2. 문과 같은 일부 시스템의 장치 파일이나 이국적인 유형의 파일은 제외되지 않습니다.
  3. 실행 가능한 모든 파일에 별표가 추가됩니다. 출력에서 '*'문자를 제거하기 위해 sed를 통해 파이프하여 처리 할 수 ​​있습니다.
  4. 줄 바꿈 문자가 포함 된 파일 이름이 있으면 제대로 작동하지 않습니다.

시스템에 나는 이것을에 쓰고, 파일의 10 %는 이름을 포함하는이 =, @또는 |문자. =base64 또는 인용 인쇄 가능 인코딩 된 부분이있는 maildir 또는 파일 이름에서 일반적입니다. @로케일 정의에서 이메일 주소 등. 파일 이름 끝에 나타나는 경우는 드 rare니다. (예를
들어이

3

매뉴얼에 'f'옵션은 파이프, 소켓 또는 블록 / 숯 장치가 아닌 '일반 파일'에만 해당됩니다. 즉 이미 올바른 작업을 수행하고 있음을 의미합니다.

   -type c
          File is of type c:

          b      block (buffered) special

          c      character (unbuffered) special

          d      directory

          p      named pipe (FIFO)

          f      regular file

          l      symbolic link; this is never true if the -L option or the
                 -follow option is in effect, unless the symbolic link  is
                 broken.  If you want to search for symbolic links when -L
                 is in effect, use -xtype.

          s      socket

          D      door (Solaris)

0

특히 짧지는 않지만 빠르게 호출해야하는 경우 스크립트 나 별칭으로 바꿀 수 있습니다. ls 명령을 입력 배열로 사용하여 grep으로 파이프 된 각 항목에서 ls -ld를 호출하여 출력이 널로 전송 된 디렉토리를 제외하고 원래 입력을 반향하는 경우 :

for list in `ls` ; do ls -ld $list | grep -v ^d > /dev/null && echo $list ; done ;

grep 및 조건부 출력을 같은 결과로 반전시킬 수 있습니다.

for list in `ls` ; do ls -ld $list | grep ^d > /dev/null || echo $list ; done ;

\dev\null?!?!
manatwork


0

이것은 약간 오래된 스레드이지만 파일 만 나열하는 가장 깨끗한 방법입니다.

ls -al | grep '^-' | awk '{print $9}'


1
touch "some file name"빠른 반례보기
Jeff Schaller

@JeffSchaller 당신은 유효한 포인트가 있습니다. 이런 식 으로요 ls -al | grep '^-' | awk '{ for(i=9; i<=NF; ++i) printf $i""FS; print "" }'공백이있는 파일을 처리해야합니다.
RJ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.