Bash 디렉토리의 디렉토리가 아닌 파일 만 나열하는 방법은 무엇입니까?


84

답변:


113

사용 find:

find . -maxdepth 1 -type f

-maxdepth 1옵션을 사용하면 현재 디렉토리 (또는를 .일부 경로로 바꾸면 해당 디렉토리) 만 볼 수 있습니다. 해당 및 하위 디렉토리에있는 모든 파일의 전체 재귀 목록을 원하면 해당 옵션을 제거하십시오.


mklement0의 답변에 대한 내 의견이 있은 후 "find ./*.png -maxdepth 1 -type f> pngs.txt"가 동일한 결과를 얻을 수 있다는 것을 깨달았습니다. 그렇습니다. 스크립트를 설치하지 않고.
Alex Hall

2
findMac에서는 -type이나 -maxdepth옵션 이 없습니다 .
Timofey

1
@Tim : -type그리고 정상적인 의미에서 옵션-maxdepth 이 아닙니다 . BSD (OS X에서 사용됨)는이를 기본 이라고 부르며 파일 이름 피연산자 ( 이 경우 ) 뒤에 와야합니다 . Linux와 달리 BSD 버전에는 하나 이상의 명시적인 파일 이름 피연산자가 필요합니다. 이 답변의 명령은 확실히 Mac에서 작동합니다. find.
mklement0

1
@AlexHall : (I 제안하지만 그 영리한 솔루션입니다 find *.png -maxdepth 0 -type f방지하기 위해 ./출력 파일 이름에 접두사를, 또한주의 -maxdepth0하지를 1)만큼 당신이 필요로하는 모든 파일이기 때문에 이름알파벳 순서 . ls다른 방법으로 할 수있는 작업 (다른 출력 형식 / 순서, 숨겨진 항목 포함 여부에 대한 인라인 제어) 을 원한다면 [다중] 유형 필터링으로 보완하면 제 답변의 스크립트가 도움이 될 수 있습니다.
mklement0 jul.

1
대답 find * -maxdepth 0 -type f과 대조하기 위해 (@AlexHall의 주석에서 파생 된 대안) find . -maxdepth 1 -type f: find . ...항상 숨겨진 항목을 포함하고 항상 출력 파일 이름 앞에를 붙이고 ./GNU find(Linux)에서는 일반적으로 정렬되지 않은 목록을 출력합니다. find * ..., 쉘이 앞쪽으로 globbing을 수행 하도록하기 때문에 기본적으로 숨겨진 항목 (으로 변경 가능)을 제외하고 shopt -s dotglob알파벳순으로 정렬 된 단순한 파일 이름 (접두사 없음)을 출력합니다. 두 방법 모두 파일에 대한 심볼릭 링크를 포함하지 않습니다 . -L그렇게 하려면 옵션 을 사용하십시오 .
mklement0 jul.

14
ls -p | grep -v /

ls -p를 사용하면 제거 할 태그 역할을하는 폴더 이름 뒤에 /를 표시 할 수 있습니다.


후자는 상대 경로를 반환하고 전자는 유일한 파일 이름을 반환하기 때문에 ls를 추가 하여 사용하는 예제를 보는 것이 좋습니다 find. 작업에 적합한 도구를 사용하십시오.
Ben Amos

5
  • carlpett의 find기반 답변 ( find . -maxdepth 1 -type f)은 원칙적으로 작동하지만 다음을 사용하는 것과 완전히 동일하지는 않습니다 ls. 모든 접두사가 붙은 잠재적으로 정렬되지 않은 파일 이름 목록 을 얻고 의 많은 옵션 을 적용 할 수있는 기능을 잃게됩니다./ls .
    또한 find 항상 숨겨진 항목도 찾는 반면 ls'동작은 -a또는 -A옵션의 유무에 따라 달라집니다 .

    • 개선 제안, 알렉스 홀 질문에 단 댓글에서는 것입니다 결합 쉘 대체 (globbing)을 함께find :

          find * -maxdepth 0 -type f  # find -L * ... includes symlinks to files
      
      • 그러나 이것은 접두사 문제를 해결하고 알파벳순으로 정렬 된 출력 을 제공하지만 여전히 숨겨진 항목의 포함을 (인라인) 제어 할 수 없으며 ls다른 많은 정렬 / 출력 형식 옵션에 액세스 할 수 없습니다 .
  • Hans Roggeman의 ls+ grep대답 은 실용적이지만 long ( -l) 출력 형식 을 사용하도록 잠급니다 .


내가 쓴 이러한 한계를 해결하기 위해 fls( f를 iltering LS 유틸리티) ,

  • 출력 유연성을ls 제공하는 동시에 유형 필터링 기능 을 제공하는 유틸리티 ,
  • 파일, 디렉토리 및 심볼릭 링크 같은 유형 필터링 문자 를 인수 목록 앞에 배치하기 만하면됩니다 (실행 하거나 자세히 알아보기).fdllsfls --helpfls --man

예 :

fls f        # list all files in current dir.
fls d -tA ~  #  list dirs. in home dir., including hidden ones, most recent first
fls f^l /usr/local/bin/c* # List matches that are files, but not (^) symlinks (l)

설치

지원되는 플랫폼

  • npm 레지스트리 에서 설치하는 경우 : LinuxmacOS
  • 수동 설치시 : Bash를 사용 하는 모든 유닉스 계열 플랫폼

로부터 NPM 레지스트리

참고 : Node.js를 사용하지 않더라도 패키지 관리자 npm인은 여러 플랫폼에서 작동하며 설치가 쉽습니다. 시험
curl -L https://git.io/n-install | bash

Node.js를가 설치되어 다음과 같이 설치합니다 :

[sudo] npm install fls -g

참고 :

  • 필요한지 여부는 sudoNode.js / io.js를 설치 한 방법과 나중에 권한을 변경 했는지 여부에 따라 다릅니다 . 당신이 얻을 경우 EACCES오류를 다시 시도하십시오 sudo.

  • -g보장 글로벌 설치를 넣어하는 데 필요한 fls시스템의에 $PATH.

수동 설치

  • 다운로드 bash스크립트 등을 fls.
  • 와 그것을 실행합니다 chmod +x fls.
  • (macOS) 또는 (Linux) $PATH와 같은 에서 폴더로 이동하거나 심볼릭 링크합니다 ./usr/local/bin/usr/bin

1
훌륭한. 다른 스크립트를 만드는 것과 관련이 있더라도. 링크하는 일반 텍스트 소스에서 텍스트 파일로 복사하여 붙여넣고 다음 명령을 사용하여 Cygwin에서 실행했습니다. fls.sh f * .png> pngs.txt 및 bingo : 경로가없는 .png 파일 목록. 하지만 실제로 ls에는 DOS의 "dir / b"스위치에 필적하는 옵션이 없습니까? 나는 ls '--help 출력의 내용을 살펴 보았는데, 적어도 거기에는 어떤 것도 없습니다.
Alex Hall

1
@AlexHall : 감사합니다. tl; dr : 시도 -1(1 번); ls실제로 기본값은 "bare"출력, 즉 파일 이름 만이지만 터미널에 출력 할 때는 열 기반 레이아웃 (한 줄에 여러 파일 이름)을 사용합니다. 출력 줄당 하나의 파일 이름을 얻으려면 ( dir /b메모리가 제공되는 경우 수행되는 작업) -1옵션을 사용합니다.이 옵션은 실제로 파이프 나 출력 파일로 보낼 때와 같이 stdout이 터미널에 연결 되지 않은 경우에 암시 적으로 설정됩니다 .
mklement0 2015 년

2

하위 디렉터리없이 일부 디렉터리의 내용 나열

ls샘플을 위해 옵션을 사용하는 것을 좋아합니다 .

  • -l 긴 목록 형식 사용
  • -t 수정 시간별로 정렬, 최신 항목부터
  • -r 정렬하는 동안 역순
  • -F, 항목에 --classify 표시기 (* / => @ | 중 하나 ) 추가
  • -h, --human-readable -l 및 -s와 함께 1K 234M 2G 등과 같은 인쇄 크기 ...

언젠가 --color다른 모든. (참조 ls --help)

폴더를 제외한 모든 항목 나열

파일, 심볼릭 링크, 장치, 파이프, 소켓 등이 표시됩니다.

그래서

find /some/path -maxdepth 1 ! -type d

날짜별로 쉽게 정렬 할 수 있습니다.

find /some/path -maxdepth 1 ! -type d -exec ls -hltrF {} +

파일 만 나열 :

또는

find /some/path -maxdepth 1 -type f

크기별로 정렬 :

find /some/path -maxdepth 1 -type f -exec ls -lSF --color {} +

숨겨진 항목 나열 방지 :

이름이 점으로 시작하는 숨겨진 항목을 표시하지 않으려면 다음을 추가 할 수 있습니다 ! -name '.*'.

find /some/path -maxdepth 1 ! -type d ! -name '.*' -exec ls -hltrF {} +

그때

당신은 대체 할 수있는 /some/path.에 대한 목록 현재 디렉토리..에 대한 상위 디렉토리 .


1

당신은 또한 사용할 수 ls와 함께 grep또는 egrep및 별칭으로 프로필에 넣어 :

ls -l | egrep -v '^d'
ls -l | grep -v '^d'

나는 위에 주어진 이유 때문에 이것을 스크립트에 넣지 않을 것이지만 또 다른 빠르고 더러운 해결책 : ls -F | 그렙 -v '/ $'
mooie

1

파일 찾기 : ls -l / home | grep "^-"| tr -s ''| 잘라 내기 -d ''-f 9

디렉토리 찾기 : ls -l / home | grep "^ d"| tr -s ''| 컷 -d ''-f 9

링크 찾기 : ls -l / home | grep "^ l"| tr -s ''| 잘라 내기 -d ''-f 9

tr -s ''는 출력을 공백으로 구분 된 파일로 변환합니다. cut 명령은 구분자가 공백이라고 말하고 9 번째 필드 (항상 파일 이름 / 디렉토리 이름 / 링크 이름)를 반환합니다.

나는 이것을 항상 사용한다!


와! 파일 이름에 공백이 있으면 어떻게됩니까?
F. Hauri

0
{ find . -maxdepth 1 -type f | xargs ls -1t | less; }

xargs작동하도록 추가 되었으며 추가 정보 없이 파일 이름 만 표시 하는 -1대신 사용-lls


이것은 시간별로 정렬을 강요한다는 점에서 약간의 장점이 있습니다. 비록 덜 서투른 방법이 있지만find -printf0 '...' | sort -z
tripleee

-2

carlpett의 대답에 추가하십시오. 훨씬 유용한 파일보기를 위해 출력을 ls로 파이프 할 수 있습니다.

find . -maxdepth 1 -type f|ls -lt|less

가장 최근에 수정 된 파일을 목록 형식으로 표시합니다. 많은 파일을 다운로드하고 최근 파일의 정리되지 않은 버전을보고 싶을 때 매우 유용합니다.


3
예상대로 작동하지 않을 수 있습니다! ls표준 입력을 읽지 않으므로 ls. 놓쳤 xargs나요?
gniourf_gniourf

다르게 말하면 : find이 대답 의 명령은 완전히 무시됩니다 . 전체 명령은 유형 필터링 ls -lt | less을 수행 하지 않는와 동일 합니다.
mklement0 jul.

1
GNU를 사용 find하면 find . -maxdepth 1 -type f -ls. 내가 생각하지만 그것은 또한 맥 OS에서 작동하는 것 같다 -maxdepth-ls제대로 휴대용 옵션이 없습니다.
tripleee

-2

"find '-maxdepth'"는 이전 버전의 bash에서 작동하지 않으므로 다음을 사용합니다.

for f in $ (ls); if [-f $ f]; 그런 다음 echo $ f; fi; 끝난


의 사용 for f in $(ls)은 두 배로 잘못되었습니다. 당신은 for f in *그것을 고칠 수는 있지만 인수를 echo올바르게 인용하지 않기 때문에 깨질 것입니다.
tripleee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.