Intereting Posts
Как я могу совместно использовать stdout между несколькими процессами? Команды для определения уровня использования сервера SSH подключается, но остается на той же машине Лучший способ освободить место на диске от удаленных файлов, которые открыты Разрывание экрана в матте с помощью compiz, а не разрывание экрана с помощью KDE или Unity grub-install –no-floppy / dev / sda не работает (Funtoo) Разъяснение по истории Unix В чем разница между этими четырьмя командами (fifo, замещение процесса, перенаправление …) Синтаксис подстановки процесса. Прямая / правая скобка против заднего / левого кронштейна Что такое программные и аппаратные прерывания и как они обрабатываются? Owncloud не показывает файлы, которые загружаются через SSH Cron Job для продолжения работы Daemon? Как запустить несколько процессов с помощью одной команды? mptscsih: ioc0: task abort: SUCCESS (rv = 2002) вызывает 30 секунд замораживания Возможно ли установить FFMPEG Linux 5.2 без root?

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

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\)] 

Но я получаю сообщение об ошибке. Как мне это сделать?

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

В нескольких оболочках есть операторы галопирования отрицания:

  • 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 -- * 

Один из вариантов – использовать find с флагами -not -name . То есть find . -not -name CentOS-Media.repo find . -not -name CentOS-Media.repo . Если вы не хотите -maxdepth 1 структуру каталогов, добавьте флаг -maxdepth 1 .

В качестве альтернативы можно написать следующее (что намного сложнее, но я забыл про флаг -not и отправил этот ответ изначально, поэтому я не удалю эту часть):

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

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

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

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

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

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

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