it-swarm-ko.tech

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

uploads라는 디렉토리가 있습니다. 여기에는 많은 파일과 파일을 포함하는 몇 개의 서브 디렉토리가 포함됩니다.

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

  1. 루트 업로드 디렉토리에있는 파일 만 나열하십시오. 하위 폴더 이름이나 그 내용을보고 싶지 않습니다.

    and

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

-d 플래그에 대해 알고 있지만 원하는 것을 얻지 못합니다.

45
EmmyS

find의 직업인 것 같습니다.

  • 사용하다 -maxdepth 현재 디렉토리 만 리턴하고 하위 폴더 내에서 반복적으로 검색하지 않습니다.
  • 사용하다 -type f 디렉토리 나 장치 노드 등을 제외한 파일 만 반환
  • -not-name 원하지 않는 이름의 파일을 피하려면

다음과 같이 함께 나타날 수 있습니다.

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

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

ls --hide='t_*' uploads

또 다른 방법은 쉘이 일치하도록하는 것입니다. Bash, ksh 및 zsh에는 t*와 일치하는 파일을 제외한 모든 파일과 일치하는 부정 패턴 !(t_*)이 있습니다. bash에서는이 기능을 shopt -s extglob로 켜야하고 zsh에서는 setopt ksh_glob로 켜야합니다. Zsh에는 ^t_*로 설정해야하는 동등한 구문 setopt extended_glob도 있습니다. 이것은 여전히 ​​디렉토리를 무시하지 않습니다. Zsh에는 이름뿐만 아니라 메타 데이터 등으로 파일을 일치시킬 수있는 추가 기능이 있습니다. glob qualifiers . 일치하는 끝에 (.)를 추가하여 일반 파일로 제한하십시오. 부정 ^는 이름 일치 구문의 일부이므로 ^t_*(.)은 "일반 파일과 일치하지 않는 모든 파일이 아니라"t_*와 일치하지 않는 모든 일반 파일 "을 의미합니다. t_*”.

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

고급 도구없이 자신을 찾으면 find를 사용하여 모든 유닉스에서이를 수행 할 수 있습니다. 일반적으로 명령 줄에 입력하는 것은 아니지만 강력하고 정확합니다. Caleb는 이미 GNU find 로이 작업을 수행하는 방법을 보여주었습니다. -maxdepth 옵션은 이식성이 없으며 -Prune를 사용할 수 있습니다. 대신 find의 재발을 중지 할 수 있습니다.

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

-print-exec ls -lG -- {} +로 바꾸고 파일에서 자주 사용하는 옵션으로 ls을 (를) 실행하십시오.

위의 모든 명령은 도트 파일 (예 : .로 시작하는 파일)을 숨 깁니다. 이를 표시하려면 -Als에 전달하거나 D glob 한정자를 zsh (ls uploads/^t_*(.D))에 추가하십시오. find를 사용하면 한 수준 만 되풀이하는 다른 방법을 사용할 수 있습니다 (find은 점 파일을 특별히 처리하지 않습니다). 현재 디렉토리에서 find를 실행하는 경우에만 완전히 작동합니다.

cd uploads && find . -name . -o -type d -Prune -o \! -type f -name 't_*' -print
ls -l /folder | grep ^- | awk '{print $9}'
10
Krayher
ls -l | grep -v ^d | grep name$

Find의 -maxdepth 이식성 문제가 우려되는 경우 다음을 사용할 수 있습니다.

ls -l uploads/ | awk '/^-/ && $9 !~/^t_/ {print $9}'

나는 전문가는 아니지만 이것이 효과가 있다고 생각합니다. 나는 조금 암호처럼 보이지만, 당신이 awk라고 말하면, 실제로는 그렇지 않습니다. $ NF 대신 $ NF를 사용할 수 있습니다. 당신은 또한 할 수 있습니다 :

ls -l uploads/ | awk '/^-/' | awk '!/^t_/ {print $9}'

그것은 같은 일을하지만 (아마도 이전의 것보다 덜 효율적입니다).

실제로 다른 게시물에 대해 생각한 후에는

ls -l --hide=t_* uploads/ | awk '/^-/ {print $9}'

더 짧고 명확한 방법입니다.

내가 틀렸다면 누군가 나를 수정하십시오. :-)

0
kkaszub

나는 이러한 짧은 길을 발견했다.

ls -p uploads | grep -Ev '/'

또는

ls -pIt_* uploads | grep -v /
0
Radu Rădeanu

ls 및 파이프를 사용하여 샷을 드리겠습니다.

ls  -l --hide='t_*'  uploads/ | grep -v ^d | tr -s ' ' | cut -d ' ' -f 9

마지막 열은 9 번째 열이라고합니다.

0
Y0NG