Intereting Posts
Измерять задержки ввода-вывода на диске для выполняемого процесса Проверьте, вошел ли пользователь в систему после нажатия «Переключить пользователей» Отображать символы замены для свободного места в Vim Почему я не могу изменить безопасный уровень OpenBSD? Ошибка «не может выделять память» при попытке создать папку в иерархии групп Переадресация порта SSH: ошибка «Привилегированные порты могут быть перенаправлены только root» Как печатать несколько файлов одновременно с помощью lpr? Что означает «Недопустимый формат модуля»? Почему iotop не показывает некоторые процессы с высоким дисковым вводом-выводом? А какой инструмент будет? Как удалить каталог с «Слишком много уровней символических ссылок» Копировать / Вставить с клавиатурой в rxvt Есть ли инструмент для просмотра и редактирования, iso-файлов, таких как PowerISO? который показывает (неизвестный) пользователь вошел в систему: что происходит? Перемещение нераспределенного пространства из расширенного раздела для создания основного раздела Как я могу использовать locate только для каталога

Исключая конкретный каталог, используя рекурсивный 'ls'

Я использовал следующую команду, чтобы перечислять последние обновленные файлы (рекурсивно) в определенном каталоге и заказывать по времени модификации:

$ stat --printf="%y %n\n" $(ls -tr $(find * -type f)) 

Тем не менее, внутри иерархии есть один каталог, в котором полно файлов, которые обновляются примерно поминутно, что делает вышеприведенную команду почти бесполезной для поиска файлов за пределами каталога-нарушителя.

Я пробовал использовать флаг ls -I но безрезультатно:

 $ stat --printf="%y %n\n" $(ls -trI 'bad-dir' $(find * -type f)) 

Есть ли простой способ исключения одного / конкретного каталога с помощью команды ls ? Или я должен подталкивать поиск в команду find ?

Вам не нужен этот дополнительный ls -tr . Это эквивалентно вашей команде и быстрее:

 find . -type f | xargs stat --printf="%y %n\n" | sort -n 

Что-то вроде этого исключает подкаталог файлов:

 find . -type f ! -path './directory/to/ignore/*' \ | xargs stat --printf="%y %n\n" \ | sort -n 

Это все равно проверяет каждый файл, если вы хотите игнорировать весь подкаталог, используйте -prune . Вам придется немного изменить порядок вещей, чтобы сначала не найти все файлы.

 find . -path './directory/to/ignore' -prune -o -type f -print0 \ | xargs -0 stat --printf="%y %n\n" \ | sort -n 

И в интересах как можно более эффективного, stat был избыточным, так как find уже обращается к файлу. Таким образом, вы на самом деле нажимаете файловую систему 2X с помощью find ... | stat ... find ... | stat ... так что вот более эффективный метод, который find всю работу.

 find . -path './directory/to/ignore' -prune -o -printf '%t %p\n' | sort -n 

Чтобы эта версия работала, мне пришлось адаптировать директивы printf с stat и find разные для метаданных различных файлов.

Рекомендации

  • найти справочную страницу
  • Страница xargs man
  • сортировать страницу

С zsh :

 stat -c '%y %n' -- **/*~path/to/ignore/*(D.Om)