Условные утверждения: поиск папок, которые не содержат определенного файла

Мне нужно было найти все папки, имена которых имеют цифру в них, которые не содержат файл, заканчивающийся на .counts.txt. Объединив несколько предложений, которые я нашел в Интернете, я смог придумать следующую команду (для bash), которая делает то, что я хочу.

find . maxdepth 1 -type d -name "*[0-9]*" ! -exec sh -c 'ls -1 "{}" | egrep -q "*.counts.txt"' \; -print 

Однако я не понимаю некоторых его особенностей:

  1. Что здесь означает восклицательный знак? Как-то это отрицает утверждение условия, которое следует?
  2. Зачем нужно открывать новую оболочку, используя sh а не прямое соединение с ls ?

Прошу прощения, если этот вопрос слишком специфичен для Exchange. Я также не думаю, что это дублированный вопрос, поскольку ни один из ответов, которые я мог найти в другом месте, не объясняет все возможности команд, которые они предлагают.

2 Solutions collect form web for “Условные утверждения: поиск папок, которые не содержат определенного файла”

  1. Да ! отменяет следующее условие, то есть -exec sh -c 'ls -1 "{}" | egrep -q "*.counts.txt"' \; -exec sh -c 'ls -1 "{}" | egrep -q "*.counts.txt"' \; , Поскольку это условие -exec , которое отрицается, мы должны помнить, что это правда, если команда, которую он выполняет, возвращает со статусом 0 (и отрицает, что условие истинно, если статус не равен 0).
  2. Аргументы after -exec не передаются в оболочку, а вместо этого выполняются напрямую, поэтому нет понятия доступного канала. Если бы вы поместили символ трубы, то внешняя оболочка (которая начала находить себя) использовала бы это, и весь вывод из find пойдет на egrep.

См. man find для документов на ! и -exec аргументы для поиска.

Все выражения find AND объединяются по умолчанию (эквивалентно -a а OR-o ). Поведение короткое, так что, если выражение оценивает значение false, выражение (выражения), которое будет следовать, не будет оцениваться.

Таким образом, значение -exec будет оценено, и если значение grep внутри будет равно true (т. Е. Если файл заканчивается на «.counts.txt»), отрицание переворачивает его на false, тем самым предотвращая оценку выражения -print и эффективно фильтруя файлы с помощью это образец.

  • Автозаполнение Bash дает другое имя файла, чем ls
  • получать размер файла и количество строк одновременно
  • Что означает символ @ в именах файлов
  • stat: время печати в формате «long-iso»
  • Почему моя петля над выходом ls не работает?
  • ZSH: `ls * (.)` Перечисляет только обычные файлы, но `ls * (/)` не перечисляет только каталоги
  • вызов команды из скрипта и сохранение стиля
  • Показывать заголовки столбцов командой «ls»
  • Как получить только файлы, созданные после даты с помощью ls?
  • Как создать имя файла для конвейера для удаления всех файлов?
  • Количество строк, выводимых ls
  • Алфавитные имена в псевдонимах `ls` с .files не перепутаны
  • Interesting Posts

    Как правильно установить программное обеспечение на Linux Mint?

    Автоматизация установки Oracle XE с недоступными и бродящими – переменные окружения Oracle неправильно отображаются?

    USB-накопитель не отображается нигде, кроме как в dmesg

    Как настроить vim для взаимодействия с интерактивными командами командной строки?

    Почему у ] и ] есть другой синтаксис?

    Настройка QEMU и MIPSEL: проблемы с сетью

    Какой файл в ядре определяет fork (), vfork () … для использования системного вызова sys_clone ()

    Получить все изображения с веб-сайта

    Как отметить «не полностью установленный» пакет apt-get как «успешно установленный»,

    Есть ли способ использовать сенсорную панель ноутбука в качестве указателя, поддерживающего давление, в программе рисования?

    обнаружение датчиков не обнаруживает

    Как я могу быть уверен, что доступ к моему домашнему серверу из моей домашней сети не осуществляется через Интернет?

    Могу ли я иметь разные настольные каталоги на разных рабочих станциях в Gnome?

    В чем смысл этого тестового выражения ?

    Как grep whitespace исключает новый символ?

    Linux и Unix - лучшая ОС в мире.