답변:
의 직업인 것 같습니다 find
.
-maxdepth
하위 폴더 내에서 반복적으로 검색하지 않고 현재 디렉토리 만 반환하는 데 사용-type f
디렉토리 나 장치 노드 등을 제외한 파일 만 반환하는 데 사용-not
하고 -name
원하지 않는 이름을 가진 파일을 피하기 위해다음과 같이 함께 나타날 수 있습니다.
find /path/to/uploads -maxdepth 1 -type f -not -name 't_*'
-exec ls -lG -- {} +
추가 옵션을 사용하여 ls에 출력을 얻기 위해 그의 대답에 사용 하는 것을 언급 했습니다. -ls
ls의 상세도에 대한 빠르고 더러운 근사값을 얻기 위해이 결과에 그냥를 추가 할 수도 있습니다 .
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 한정자 . (.)
일치하는 끝에 추가 하여 일반 파일로 제한하십시오. 부정 ^
은 이름 일치 구문의 일부이므로 ^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
파일에 당신의 마음에 드는 옵션.
위의 모든 명령은 도트 파일 (즉, 이름이로 시작하는 파일)을 숨 깁니다 .
. 당신이 그들을 표시 통과 할 경우 -A
에 ls
, 또는 추가 D
zsh을에 글로브 한정자를 ( ls uploads/^t_*(.D)
). 을 사용하면 find
한 수준 만 반복하도록 다른 접근 방식을 사용할 수 있습니다 ( find
점 파일은 특별히 처리하지 않음). find
현재 디렉토리에서 실행 하는 경우에만 완벽하게 작동합니다 .
cd uploads && find . -name . -o -type d -prune -o \! -type f -name 't_*' -print
-maxdepth
것이 좋지만 Gilles가 언급 한 "휴대 성"문제는 BSD find
(OSX에서도 발견됨)가 약간 다른 동물이기 때문에 그의 대답이 필요할지도 모른다. @Gilles : zsh 트릭에 +1!
prune
들 마음에 와서,하지만 난 단순히 내 자신의 시스템에 배 생각 "의 수를 주위에 일 처리있을 때하는 것을 말하며 가자거야 내가이 명령 작업에 있었다 것인지 AIX, Solaris 또는 MINIX3 "는 대략 ... 대기입니다 ... 미터 표시 값을 얻는 데 어려움을 겪고 있습니다 ... 디스플레이가으로 고정됩니다 0.00
.
ls
에는 --use-telepathy
옵션이 없습니까? 원하는 파일 만 표시하는 가장 빠른 방법입니다. 휴대용이 아닐 수도 있습니다.
ls -l | grep -v ^d | grep name$
find
?
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}'
더 짧고 명확한 방법입니다.
내가 틀렸다면 누군가 나를 수정하십시오. :-)
ls
은 일반적으로 좋은 생각이 아닙니다 . 예를 들어 공백이있는 파일 이름으로 어색한 트릭이 실패합니다.
이 별칭을 사용 해보고 사용하십시오.
alias l='ls -hLlF'
ls -hLlF
하위 디렉토리를 표시하고로 시작하는 파일을 표시합니다 t_
. 그렇다면 이것이 어떻게 질문에 대답합니까?