Як знайти всі файли, крім вказаного файлу


13

lsМоже дати результат , як

[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ls

CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo

Але на самом деле я сподіваюся тільки з'ясувати CentOS-Base.repo, CentOS-Debuginfo.repoі , CentOS-Vault.repoале не CentOS-Media.repo. Тому я виконую цю команду

ls [^\(Media\)]

Але я отримую інформацію про помилку. Як мені це зробити?



@steeldriver Дякую за ваше посилання, що дуже корисно для мене ..
yode

Ви могли б розглянути питання про перехід на вашу оболонку Zsh , яка має видалення шаблону об'єкт
Basile Starynkevitch

Відповіді:


10

У найпростішому випадку ви можете використовувати наступне (у випадку, якщо 1-й підслів статичний CentOS):

ls CentOS-[BDV]*

  • [BDV] - клас символів для забезпечення другого підслова, починаючи з одного із зазначених символів

те ж саме із запереченням :

ls CentOS-[^M]*

Якщо ви хочете ігнорувати всі назви файлів, які містять Mсимвол, при реалізації GNU ls(як це зазвичай зустрічається у CentOS), скористайтеся параметром -I( --ignore):

ls -I '*M*'

-I, --ignore = PATTERN
не перераховує маються на увазі записи, що відповідають оболонці PATTERN

Щоб ігнорувати записи Mediaсловом:

ls -I '*Media*'

Ці зразки потрібно передати дослівно ls, тому вони повинні бути цитованими (інакше оболонка розглядає їх як глобуси для розширення).


Чому ми не можемо використовувати ls *[^M]*
yode

ls CentOS-[^M]*Робота, але ls *[^M]*немає ..
yode

@yode, залежить від того, що саме ви хочете ігнорувати: Mвиникнення символів АБО Mediaслово?
RomanPerekhrest

Але в моєму випадку лише цей файл має характер M.
йод

3
Шаблони жадібні: перший * відповідає всім, крім останньої літери, [^ М] відповідає останній букві, оскільки жодна з них не закінчується буквою М, а проміжна * відповідає чистому рядку. Так вони всі відповідають. І навіть якщо щось закінчилося з M, воно все одно збігатиметься, припускаючи, що десь щось відрізняється від M: наприклад, якщо у вас був файл під назвою OOM, перша зірка відповідала б першому O, [^ M] відповідатиме другому O і
останній

12

Кілька снарядів мають оператори глобалізації заперечення:

  • zsh -o extendedglob:

    ls -d -- ^*Media*
    ls -d -- *.repo~*Media* # ~ is "except" operator
    
  • ksh, zsh -o kshglob, bash -O extglob:

    ls -d -- !(*Media*)
    
  • bash:

    GLOBIGNORE='*Media*'
    ls -d -- *
    
  • ksh:

    FIGNORE='@(*Media|.)*'
    ls -d -- *
    

6

Один з варіантів - використовувати findз -not -name прапорами. Тобто find . -not -name CentOS-Media.repo. Якщо ви не хочете повторювати структуру каталогу, додайте -maxdepth 1прапор.

Як варіант, можна написати наступне (що набагато складніше, але я забув про -notпрапор і опублікував цю відповідь спочатку, тому цю частину не видаляю):

find . -print0 | grep --invert-match -z "CentOS-Media.repo$" | tr '\0' '\n'

Вам потрібно змусити findвідокремлювати назви файлів з нульовим байтом, щоб нові рядки в ім’ях файлів нічого не зламали. Сподіваємось, grepпідтримує цей вид роздільника з прапором -z. Ви можете повернутись до типового розділення (тобто нульовий байт -> новий рядок) за допомогоюtr '\0' '\n'


1
Ви також можете отримати printf '%s\0' *файли, розділені на нуль, з якими не повторюється і не містить точкових файлів за замовчуванням (але деякі оболонки мають для цього можливість). Вам також не потрібно -Eдля цього regexp, але, щоб бути прискіпливим, вам слід або нахилити нахил .або вставити його [], і ви залежите від GNU find and grep.
dave_thompson_085

4

Найпростіший спосіб - скористатися знахідкою. Зробіть:

find . -maxdepth 1 -type f ! -name "CentOS-Media.repo"

Тут "f" означає пошук лише звичайних файлів (виключає символьні посилання на звичайні файли; хоча GNU findвикористовуйте -xtype fзамість цього, щоб включити їх). Якщо ви хочете шукати каталоги, замість цього переведіть "d".

( -maxdepthхоча спочатку розширення GNU зараз досить поширене. Якщо ваше findне підтримує його, ви можете замінити -maxdepth 1його стандартним ! -name . -prune).

перегляньте сторінку пошуку чоловіка, щоб отримати додаткові функції.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.