라는 디렉토리가 uploads
있습니다. 여기에는 많은 파일과 파일을 포함하는 몇 개의 서브 디렉토리가 포함됩니다.
한 단계로 다음을 수행 할 수있는 방법이 있습니까?
-
루트 업로드 디렉토리에있는 파일 만 나열하십시오. 하위 폴더 이름이나 내용을보고 싶지 않습니다.
과
-
로 시작하는 파일을 나열하지 마십시오
t_
나는 -d
깃발 에 대해 알고 있지만, 내가 원하는 것을 얻지 못한다.
답변
의 직업인 것 같습니다 find
.
-maxdepth
하위 폴더 내에서 반복적으로 검색하지 않고 현재 디렉토리 만 반환하는 데 사용-type f
디렉토리 나 장치 노드 등을 제외한 파일 만 반환하는 데 사용- 경우에 조합을 사용
-not
하고-name
원하지 않는 이름을 가진 파일을 피하기 위해
다음과 같이 함께 나타날 수 있습니다.
find /path/to/uploads -maxdepth 1 -type f -not -name 't_*'
답변
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
답변
ls -l /folder | grep ^- | awk '{print $9}'
답변
ls -l | grep -v ^d | grep name$
답변
ls
파이프를 사용하여 샷을 드리겠습니다 .
ls -l --hide='t_*' uploads/ | grep -v ^d | tr -s ' ' | cut -d ' ' -f 9
마지막 열은 9 번째 열이라고합니다.
답변
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 -p uploads | grep -Ev '/'
또는
ls -pIt_* uploads | grep -v /