Lista plików niepasujących do podanego ciągu w nazwie pliku

16

Mam katalog, w którym wiele plików (około 200) o tej nazwie temp_log.$$jest tworzonych z kilkoma innymi ważnymi plikami, które muszę sprawdzić.

Jak mogę łatwo wymienić wszystkie pliki i wykluczyć wyświetlanie temp_log.$$plików?

Oczekiwany wynik

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

Przejrzałem lsstronę podręcznika, ale nie mogłem znaleźć niczego w tym odnośniku. Daj mi znać, jeśli przegapiłem jakieś istotne informacje tutaj.

Dzięki

Mtk
źródło
w BASH ls --hide='temp_log.$$'powinno działać. Możesz / powinieneś również rozszerzyć to o symbole wieloznaczne, w zależności od tego, która część całego terminu temp_log.$$jest.
erch

Odpowiedzi:

25

Za pomocą GNU ls(wersja na niewbudowanego Linuxa i Cygwina, czasem również znajdowana gdzie indziej), można wykluczyć niektóre pliki podczas wyświetlania katalogu.

ls -I 'temp_log.*' -lrt

(zwróć uwagę na długą formę -IIs --ignore='temp_log.*')

Za pomocą Zsh możesz pozwolić powłoce na filtrowanie. Przejdź -ddo ls, aby uniknąć wyświetlania zawartości pasujących katalogów.

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

Za pomocą ksh, bash lub zsh możesz użyć składni filtrującej ksh. W Zsh, uruchom setopt ksh_globpierwszy. W bash biegnij shopt -s extglobpierwszy.

ls -dltr !(temp_log.*)
Gilles „SO- przestań być zły”
źródło
Proszę, nie pojedynczych cudzysłowów w przykładzie dla GNU ls: ls -I 'temp_log. *' -Lrt Są one konieczne, aby przekazać wzór do polecenia i nie pozwolić, aby powłoka go rozwinęła.
shargors,
W Ubuntu bash v4.3.48 powinno być -Itemp_log.*bez spacji po-I
Yan King Yin
1
@YanKingYin Nie, dobrze jest mieć spację po -I. Trzeba jednak *cytować w ten czy inny sposób. -I temp_log.*nie działa, ale -I 'temp_log.*', -I "temp_log.*", -I temp_log.\*, itd. są w porządku.
Gilles „SO- przestań być zły”
10

Możesz używać grepz tą opcją -v.

ls -lrt | grep -v <exclude-filename-part>
andrade
źródło
1
nie jestem pewien, dlaczego zostało to odrzucone, to poprawna odpowiedź.
Tim Kennedy,
5
Wykonanie grep na wyjściu ls nie zawsze jest poprawne i nie jest zalecane. Ma skutki uboczne. Nie mogę przypomnieć sobie dokładnych problemów. Uwaga dodatkowa - głosowanie w dół nie pochodziło ode mnie;)
Mt
3

Możesz użyć finddo tego:

find . \! -name 'temp_log*'

Spowoduje to po prostu wydrukowanie nazw, które można dodać, -lsaby uzyskać ls -lstyl z sygnaturą czasową i uprawnieniami, lub użyć -exec ls {} +do przekazania do ls z dowolnymi opcjami dla kolumn, sortowania itp.

Napisałem to, zakładając, że to tylko pliki w katalogu. Jeśli katalog zawiera inne katalogi, możesz uniknąć ich rekurencyjnego wyświetlania

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

A jeśli użyjesz ls, będziesz chciał przekazać opcję -d, aby zatrzymać wyświetlanie jej w katalogach:-exec ls -d {} +

Losowo 832
źródło
Prawdopodobnie też chcę -maxdepth 1naśladować nierekurencyjne ls.
jw013,
Ładny. Użytkownicy, którzy mają bardziej minimalny POSIX findbez, -maxdepth powinni zajrzeć tutaj .
Wildcard,
2

Myślę, że chcesz użyć funkcji powłoki, a nie ls. Używam bash, więc sprawdziłem, co chcesz man bash. Wyszukaj „^ EXPANSION”, (najpierw naciskając „/”). Fragment:

EKSPANSJA

    Rozwinięcie jest wykonywane w wierszu polecenia po podzieleniu go na słowa. Istnieje siedem rodzajów ekspansji wykonywane: interpretacja nawiasów , tyldy , parametrów i zmiennych ekspansji , podstawiania poleceń , interpretacji wyrażeń arytmetycznych , podziałowi na słowa i rozwijania nazw plików .

   ︙
... <snip> ...
   ︙

Rozszerzenie nazwy ścieżki

    Po podziałowi na słowa, chyba że -f opcja została ustawiona, bash skanuje każde słowo znakami *, ?oraz [. Jeśli pojawi się jeden z tych znaków, to słowo jest traktowane jako wzór i zastępowane alfabetycznie uporządkowaną listą nazw plików pasujących do wzorca. …

Niedawno zacząłem wykluczać pliki na podstawie ich pierwszej litery za pomocą polecenia:

$ ls ./[^t]*

To pasowałoby do wszystkiego, co nie zaczyna się na literę t. Jeśli dodasz więcej znaków między nawiasami, wykluczasz także pliki zaczynające się od tych liter.

Szukam linku, a ja mam dobry! Zobacz Dopasowywanie wzorów . Odtąd zadziałałoby to w twoim przypadku:

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

Wymaga to włączenia extglobopcji powłoki za pomocą shoptwbudowanego ( shopt -s extglob), jak stwierdził Gilles .

Alex Leach
źródło
-1

Po prostu zrób

ls -ltr `grep -il patterntosearch  *`
użytkownik43658
źródło
grepszuka wzorca w pliku, a nie w nazwie pliku.
evilsoup
-2

Ponieważ pliki, których NIE ZWRÓCISZ chcesz wydrukować, mają „temp_log”. w nazwie pliku, a następnie odfiltruj za pomocą grep:

ls -lrt | grep -v "temp_log."

UWAGA: Drugi post z podobną odpowiedzią prawdopodobnie został odrzucony, ponieważ użytkownik nie uwzględnił cudzysłowów wokół ciągu, którego powinien szukać grep. Bez cytatów nie działa tak, jak reklamowano.

użytkownik185160
źródło
Twoja „UWAGA” nie jest ściśle poprawna. Są pewne znaki, które mogą wymagać cytowania, ale nie sądzę, aby były w tym konkretnym ciągu.
pali 2345
dopóki nie pojawi się użytkownik lub grupa o nazwie „temp_log” (kropka w wyrażeniu regularnym będzie pasować do spacji lub czegokolwiek następującego temp_log. To nie jest dobry (ogólny) sposób wykluczania lswyników.
Jeff Schaller
tylko z -F, @ smokes2345; kropka będzie pasować do dowolnego znaku w podstawowym wyrażeniu regularnym. Zobacz: unix.stackexchange.com/q/119905/117549
Jeff Schaller