Список файлів, що не відповідають заданому рядку в імені файлу


16

У мене є каталог, в якому створено безліч файлів (близько 200) з назвою temp_log.$$з кількома іншими важливими файлами, які мені потрібно перевірити.

Як я можу легко перерахувати всі файли та виключити їх temp_log.$$відображення?

Очікуваний вихід

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

Я переглянув lsсторінку людини, але не зміг знайти нічого в цьому посиланні. Будь ласка, дайте мені знати, якщо я пропустив будь-яку важливу інформацію тут.

Спасибі


в БАШ, ls --hide='temp_log.$$'повинен працювати. Ви можете / повинні також продовжити це за допомогою макетів, залежно від того, яка частина всього терміну temp_log.$$є.
erch

Відповіді:


25

За допомогою GNU ls(версії для невбудованих Linux та Cygwin, іноді також зустрічаються в іншому місці) ви можете виключати деякі файли при переліку каталогу.

ls -I 'temp_log.*' -lrt

(зауважте, довга форма -Iє --ignore='temp_log.*')

За допомогою zsh ви можете дозволити оболонці фільтрувати. Передайте , -dщоб lsтаким чином , щоб уникати перерахування вмісту відповідних каталогів.

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

За допомогою ksh, bash або zsh можна використовувати синтаксис фільтрації ksh. У zsh запустіть setopt ksh_globпершим. У баш, біжи shopt -s extglobпершим.

ls -dltr !(temp_log.*)

Будь ласка, не одиничні лапки в прикладі для GNU ls: ls -I 'temp_log. *' -Lrt Вони необхідні для передачі шаблону команді і не дозволяють оболонці розширювати її.
Шаргори

На Ubuntu bash v4.3.48 він повинен бути -Itemp_log.*без місця після-I
Ян Кінг Інь

1
@YanKingYin Ні, це прекрасно мати місце після -I. Однак *потреби цитуються так чи інакше. -I temp_log.*не працює , але -I 'temp_log.*', -I "temp_log.*", -I temp_log.\*і т.д. все в порядку.
Жил "ТАК - перестань бути злим"

10

Ви можете використовувати grepз опцією -v.

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

1
не впевнений, чому це було знято, це правильна відповідь.
Тім Кеннеді

5
Робити греп на виході 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 повинні шукати тут .
Wildcard

2

Я думаю, ви хочете використовувати функцію оболонки, а не ls. Я використовую bash, тому я перевірив, що ти хочеш man bash. Шукайте "^ EXPANSION", (натискаючи "/"). Витяг:

РОЗШИРЕННЯ

    Розширення виконується в командному рядку після його поділу на слова. Є сім видів розширення виконується: в фігурних дужках , тильди , параметрів і змінних розширення , підстановки команд , арифметичне розширення , слово розщеплення і розширення імен файлів .

   ︙
... <snip> ...
   ︙

Розширення шляху

    Після слів розщеплення, якщо -f параметр не встановлено, Баш сканує кожне слово для символів *, ?і [. Якщо з’являється один з цих символів, то слово вважається візерунком і замінюється алфавітно відсортованим списком імен файлів, що відповідають шаблону. …

Нещодавно я почав виключати файли на основі їх першої літери з такою командою:

$ ls ./[^t]*

Це відповідатиме тому, що не починається з букви t. Якщо ви додасте більше символів між дужками, ви виключаєте файли, починаючи з цих літер.

Шукаю посилання, і я хороший! Дивіться відповідність шаблонів . Звідси це буде працювати для вашого випадку:

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

Це вимагає, щоб extglobопція оболонки була включена за допомогою shoptвбудованого ( shopt -s extglob), як заявляє Гілль .



-2

Так як файли , які ви DONT хочете друкуватися є «temp_log.» у назві файлу, а потім відфільтруйте за допомогою grep:

ls -lrt | grep -v "temp_log."

ПРИМІТКА. Інша публікація з подібною відповіддю, ймовірно, була оприлюднена, оскільки користувач не включав лапки навколо рядка, який слід шукати grep. Без лапок це не працює так, як рекламується.


Ваше "ПРИМІТКА" не є строго правильним. Є певні символи, які, можливо, потребуватимуть цитування, але я не думаю, що в цьому рядку є такі.
курить2345

поки не знайдеться користувач або група з назвою "temp_log" (крапка в регулярному виразі відповідатиме пробілу чи іншому, що слідує temp_log. Це не гарний (загальний) спосіб виключення lsрезультатів.
Jeff Schaller

тільки з -F, @ smokes2345; період буде відповідати будь-якому символу в основному регулярному виразі. Дивіться: unix.stackexchange.com/q/119905/117549
Jeff Schaller
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.