디렉토리없이 파일을 나열하고 이름으로 필터링하는 방법 (ls 옵션) 파일 만 나열하십시오. 하위 폴더 이름이나

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

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

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

  2. 로 시작하는 파일을 나열하지 마십시오 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파일에 당신의 마음에 드는 옵션.

위의 모든 명령은 도트 파일 (즉, 이름이로 시작하는 파일)을 숨 깁니다 .. 당신이 그들을 표시 통과 할 경우 -Als, 또는 추가 Dzsh을에 글로브 한정자를 ( 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 /