현재 디렉토리의 일반 파일 만 표시 (디렉토리 제외) 데 사용할 수

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

find . -maxdepth 1 -type f

또는 통계

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

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



답변

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

echo *(.)

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

비 디렉토리의 경우 :

echo *(^/)

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

echo *(-.)

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

echo *(-^/)

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

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


답변

ls -p | grep -v / 

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

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


답변

일반 파일 만 나열하려면

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


답변

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존재 하지 않는 한 도트 파일을 제외 할 수 있습니다.


답변

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

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

약점은 다음과 같습니다.

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

답변

매뉴얼에 ‘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)


답변

특히 짧지는 않지만 빠르게 호출해야하는 경우 스크립트 나 별칭으로 바꿀 수 있습니다. 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 ;