파일 이름에 지정된 문자열과 일치하지 않는 파일을 나열하십시오.


16

이름 temp_log.$$이 있는 많은 파일 (약 200 개)이 확인해야 할 다른 중요한 파일로 만들어 지는 디렉토리 가 있습니다.

모든 파일을 쉽게 나열하고 temp_log.$$파일이 표시되지 않도록 하려면 어떻게해야합니까?

예상 출력

$ ls -lrt <exclude-filename-part>
-- Lists files not matching the above given string

내가 겪었 lsman 페이지 만이 참조에서 아무것도 찾을 수 없습니다. 여기서 중요한 정보를 놓친 경우 알려주십시오.

감사


BASH에서 ls --hide='temp_log.$$'작동해야합니다. 전체 용어의 어느 부분인지에 따라 와일드 카드로이를 확장 할 수도 있습니다 temp_log.$$.
erch

답변:


25

GNU ls(임베디드 Linux 및 Cygwin의 버전, 때로는 다른 곳에서도 있음)를 사용하여 디렉토리를 나열 할 때 일부 파일을 제외 할 수 있습니다.

ls -I 'temp_log.*' -lrt

(의 긴 형식은 -I입니다 --ignore='temp_log.*')

zsh를 사용하면 셸에서 필터링을 수행 할 수 있습니다. 패스 -dls일치하는 디렉토리의 내용을 나열 피하기 위해.

setopt extended_glob          # put this in your .zshrc
ls -dltr ^temp_log.*

ksh, bash 또는 zsh와 함께 ksh 필터링 구문을 사용할 수 있습니다. zsh에서 setopt ksh_glob먼저 실행하십시오 . bash에서 shopt -s extglob먼저 실행하십시오 .

ls -dltr !(temp_log.*)

GNU ls에 대한 예제에서 작은 따옴표는 아닙니다. ls -I 'temp_log. *'-lrt 명령에 패턴을 전달하고 쉘이 확장하지 못하게해야합니다.
shargors

우분투 bash는 v4.3.48에, 그것은해야 -Itemp_log.*어떤 공간없이 후-I
연의 왕 음과

1
@YanKingYin 아니요, 뒤에 공백이 있으면 -I좋습니다. 그러나 *어떤 방식 으로든 인용해야합니다. -I temp_log.*작동하지 않지만 -I 'temp_log.*', -I "temp_log.*", -I temp_log.\*, 등은 정상입니다.
Gilles 'SO- 악마 그만'

10

grep옵션과 함께 사용할 수 있습니다 -v.

ls -lrt | grep -v <exclude-filename-part>

1
이것이 왜 다운 보트인지 확실하지 않으면 정답입니다.
팀 케네디

5
ls 출력에서 ​​grep을 수행하는 것이 항상 올바른 것은 아니며 권장되지 않습니다. 부작용이 있습니다. 정확한 문제를 불러올 수 없습니다. 사이드 노트 다운 투표는 나에게서가 아니었다;)
mtk

1
ls 파싱이 나쁜 아이디어 인 이유에 대한 링크는 다음과 같습니다 .
mtk

3

find이것을 위해 사용할 수 있습니다 :

find . \! -name 'temp_log*'

이름을 인쇄하고 타임 스탬프 및 권한 -ls으로 ls -l스타일 출력을 추가 하거나 -exec ls {} +열, 정렬 등에 원하는 옵션을 사용 하여 실제로 ls에 전달하는 데 사용할 수 있습니다.

나는 이것이 디렉토리에있는 파일이라고 가정하여 이것을 썼습니다. 디렉토리에 다른 디렉토리가 포함되어 있으면 재귀 적으로 나열하지 않도록 할 수 있습니다

find . \! -name 'temp_log*' -maxdepth 1

ls를 사용하면 -d 옵션을 전달 하여 디렉토리 내부에 나열되지 않도록 할 수 있습니다.-exec ls -d {} +


아마도 -maxdepth 1비 재귀를 모방하기를 원할 것 ls입니다.
jw013

좋은. 더 최소한의 POSIX있는 사용자 find않고는 -maxdepth 여기에 보일 것입니다 .
와일드 카드

2

의 기능이 아닌 쉘의 기능을 사용하고 싶다고 생각합니다 ls. bash를 사용하므로에서 원하는 것을 확인했습니다 man bash. "^ EXPANSION"을 검색하십시오 (먼저 '/'를 누름). 발췌 :

확장

    확장은 단어로 분할 된 후 명령 행에서 수행됩니다. 괄호 확장 , 물결표 확장 , 매개 변수 및 변수 확장 , 명령 대체 , 산술 확장 , 단어 분할경로 이름 확장의 7 가지 확장이 수행 됩니다.

   ︙
... <싹둑>>
   ︙

경로명 확장

    하지 않는 단어 분할 한 후, -f 옵션이 설정되어, 배쉬는 문자에 대한 각 단어를 검색 *, ?[. 이러한 문자 중 하나가 나타나면 단어는 패턴으로 간주되고 패턴 과 일치하는 알파벳순으로 정렬 된 파일 이름 목록으로 대체됩니다. …

최근에 첫 번째 문자를 기반으로 파일을 제외하기 시작했습니다.

$ ls ./[^t]*

이것은 글자로 시작하지 않는 것과 일치합니다 t. 대괄호 사이에 문자를 더 추가하면 해당 문자로 시작하는 파일도 제외됩니다.

링크를 찾고 좋은 링크를 찾았습니다! 패턴 일치를 참조하십시오 . 거기에서 이것은 귀하의 경우에 효과가 있습니다.

$ ls -lrt ./!(temp_log.*)

이를 위해서는 Gilles가 언급 한대로 extglob쉘 옵션이 shopt내장 ( shopt -s extglob)을 사용하여 활성화 되어야합니다 .


-1

그냥 해

ls -ltr `grep -il patterntosearch  *`

grep파일 이름이 아닌 파일 내에서 패턴을 검색합니다.
evilsoup

-2

파일 때문에 당신은 그나마 인쇄 싶다 "temp_log을."가 파일 이름에서 grep을 사용하여 필터링하십시오.

ls -lrt | grep -v "temp_log."

참고 : 사용자가 grep에서 찾아야하는 문자열 주위에 따옴표 ""를 포함하지 않았기 때문에 비슷한 답변을 가진 다른 게시물이 다운 보트되었을 수 있습니다. 따옴표가 없으면 광고 된대로 작동하지 않습니다.


귀하의 '참고'는 엄격하지 않습니다. 인용해야 할 특정 문자가 있지만 특정 문자열에는 없다고 생각합니다.
smokes2345

"temp_log"라는 이름의 사용자 나 그룹이있을 때까지 (정규 표의 점은 공백이나 뒤에 오는 것과 일치합니다 temp_log. 이것은 ls결과 를 제외하는 좋은 (일반적인) 방법이 아닙니다 .
Jeff Schaller

-F@ smokes2345 만 ; 마침표는 기본 정규 표현식의 모든 문자와 일치합니다. 다음을 참조하십시오 : unix.stackexchange.com/q/119905/117549
Jeff Schaller
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.