디렉터리 없이 파일을 나열하고 이름으로 필터링하는 방법(ls 옵션)

디렉터리 없이 파일을 나열하고 이름으로 필터링하는 방법(ls 옵션)

라는 디렉토리가 있습니다 uploads. 여기에는 여러 파일과 파일이 포함된 일부 하위 디렉터리가 포함되어 있습니다.

다음을 한 단계로 수행할 수 있는 방법이 있습니까?

  1. 루트 업로드 디렉터리에 있는 파일만 나열합니다. 하위 폴더 이름이나 해당 내용을 보고 싶지 않습니다.

    그리고

  2. 다음으로 시작하는 파일을 나열하지 마십시오.t_

나는 -d그 깃발을 이해하지만, 내가 원하는 것을 얻지는 못합니다.

답변1

이것은 직업처럼 들리네요 find.

  • -maxdepth하위 폴더 내에서 재귀적으로 검색하는 대신 현재 디렉터리만 반환하는 데 사용됩니다.
  • -type f디렉터리나 장치 노드 또는 기타 항목이 아닌 파일만 반환하는 데 사용됩니다 .
  • -not-name원하지 않는 이름의 파일을 피하려면 if와 조합을 사용하세요.

다음과 같이 합쳐질 수 있습니다.

find /path/to/uploads -maxdepth 1 -type f -not -name 't_*'

답변2

GNU ls(즉, 내장되지 않은 Linux 시스템 및 Cygwin의 ls 명령과 일부 다른 unices에서도 사용 가능)에는 이름을 기준으로 특정 파일을 숨기는 옵션이 있습니다. 그러나 디렉토리를 무시할 수 있는 방법은 없습니다.

ls --hide='t_*' uploads

또 다른 방법은 쉘이 일치하도록 하는 것입니다. Bash, ksh 및 zsh에는 !(t_*)일치하는 파일을 제외한 모든 파일과 일치하는 네거티브 패턴이 있습니다 t*. bash에서는 이 기능을 활성화해야 하며 shopt -s extglob, zsh에서는 이 기능을 활성화해야 합니다 setopt ksh_glob. Zsh에는 또한 ^t_*사용해야 하는 동등한 구문이 있습니다 setopt extended_glob. 이것은 여전히 ​​디렉토리를 무시하지 않습니다. Zsh에는 이름뿐만 아니라 메타데이터 등을 기준으로 파일을 일치시키는 추가 기능이 있습니다.글로벌 예선. (.)일반 파일로 제한하려면 일치가 끝나면 추가하세요 . 부정은 ^이름 일치 구문의 일부이므로 ^t_*(.)"일반 파일과 일치하지 않는 모든 파일 t_*"이 아니라 "일치하지 않는 모든 일반 파일 t_*"을 의미합니다.

setopt extended_glob  # put this in your ~/.zshrc
ls uploads/^t_*(.)

고급 도구가 없다면 를 실행할 수 있습니다 find.Caleb은 GNU find를 사용하여 이를 수행하는 방법을 보여주었습니다.. 이 옵션은 이식 가능하지 않습니다. 이식 가능하게 재귀를 중지하는 데 -maxdepth사용할 수 있습니다 .-prunefind

find uploads/* -type d -prune -o \! -type f -name 't_*' -print

-print파일에서 -exec ls -lG -- {} +원하는 옵션을 수행 하려면 로 바꾸십시오 .ls

위의 모든 명령은 도트 파일(예: 이름이 로 시작하는 파일 .)을 숨깁니다. 이를 표시하려면 에 전달 하거나 -Azsh() 에 lsglob 한정자를 추가하세요 . 를 사용하면 다른 방법을 사용하여 한 수준만 재귀적으로 만들 수 있습니다(점 파일을 특별히 처리하지 않음). 이는 현재 디렉터리에서 실행 중인 경우에만 완전히 작동합니다.Dls uploads/^t_*(.D)findfindfind

cd uploads && find . -name . -o -type d -prune -o \! -type f -name 't_*' -print

답변3

ls -l /folder | grep ^- | awk '{print $9}'

답변4

나는 다음과 같은 짧은 방법을 찾았습니다.

ls -p uploads | grep -Ev '/'

또는

ls -pIt_* uploads | grep -v /

관련 정보