Как найти все файлы, кроме указанного файла

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.repoCentOS-Debuginfo.repoи CentOS-Vault.repoнет CentOS-Media.repo. Поэтому я запускаю эту команду

ls [^\(Media\)]

Но я получаю информацию об ошибке. Как мне поступить?

yode
источник
@steeldriver Спасибо за вашу ссылку, это очень полезно для меня ..
Йод
Вы могли бы рассмотреть вопрос о переходе на вашу оболочку 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, поэтому должны быть заключены в кавычки (в противном случае оболочка будет рассматривать их как глобусы для расширения).

RomanPerekhrest
источник
Почему мы не можем использовать ls *[^M]*
йод
ls CentOS-[^M]*Работа, но ls *[^M]*нет ..
yode
@yode, зависит от того, что именно вы хотите игнорировать: Mвхождение символа ИЛИ Mediaслово?
РоманПерехрест
Но в моем случае только этот файл имеет характер M.
yode
3
Шаблоны жадные: первая * соответствует всему, кроме последней буквы, [^ M] соответствует последней букве, поскольку ни одна из них не заканчивается на M, а завершающая * соответствует пустой строке. Таким образом, они все совпадают. И даже если что-то заканчивалось на M, оно все равно совпадало бы, предполагая, что где-то что-то отличалось от M: например, если у вас был файл с именем OOM, первая звезда соответствовала бы первому O, [^ M] соответствовала бы второму O и конечный старт будет соответствовать M.
NickD
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в этом регулярном выражении, но чтобы быть разборчивым, вы должны либо .поставить обратную косую черту, либо вставить ее [], и вы зависите от GNU find и grep.
dave_thompson_085
4

Самый простой способ - использовать find. Делать:

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

Здесь «е» означает поиск обычных файлов только ( за исключением символических ссылок на обычных файлов , хотя, с GNU find, использование -xtype fвместо того, чтобы включить их). Если вы хотите искать каталоги, вместо этого введите «d».

( -maxdepthХотя изначально расширение GNU сейчас довольно распространено. Если findоно не поддерживается, его можно заменить -maxdepth 1стандартным ! -name . -prune).

см. справочную страницу поиска для более удивительных функций.

Аль 123
источник