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
답변
ls
unix & 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뿐만 아니라 모든 쉘에서 작동합니다.
약점은 다음과 같습니다.
- 그의 이름은 모든 파일의 종료
@
,=
또는|
제외됩니다 (하지만 당신은 정말 어쨌든 이름에 이러한 문자와 파일이 안된다) - 문과 같은 일부 시스템의 장치 파일이나 이국적인 유형의 파일은 제외되지 않습니다.
- 실행 가능한 모든 파일에 별표가 추가됩니다. 출력에서 ‘*’문자를 제거하기 위해 sed를 통해 파이프하여 처리 할 수 있습니다.
- 줄 바꿈 문자가 포함 된 파일 이름이 있으면 제대로 작동하지 않습니다.
답변
매뉴얼에 ‘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 ;