Поиск с помощью поиска locate
путей в файловой системе.
Зачастую вы априори знаете, что вас интересуют либо только файлы, либо только каталоги.
Поиск по местоположению часто возвращает много результатов. Было бы полезно включить в результат только один из типов, потому что это помогает сократить вывод.
Но есть более интересный аргумент, чтобы пропустить файлы или каталоги: потому что список путей к результатам может быть неоднозначным - не только в теории.
Приведенный ниже пример представляет собой реальный случай, и не является необычным:
$ locate --regex --basename "xfce4-keyboard-overlay$"
/usr/local/bin/xfce4-keyboard-overlay
/usr/local/share/xfce4-keyboard-overlay
Хорошо, мы нашли что-то! Но ... файлы или каталоги?
$ file /usr/local/bin/xfce4-keyboard-overlay
/usr/local/bin/xfce4-keyboard-overlay: bash script
Так что это файл ...
$ file /usr/local/share/xfce4-keyboard-overlay
/usr/local/share/xfce4-keyboard-overlay: directory
пока второго нет.
Эта двусмысленность делает длинные списки путей трудными для чтения, поэтому было бы очень хорошо отфильтровать каталоги, например, используя опцию командной строки для locate
.
Существует ли что-то подобное? Даже если фильтр для каталогов отделен от locate?
По крайней мере, можно использовать скрипт для итерации всех имен файлов для проверки - что может быть медленным.
while
заявления?printf
для произвольных данных .locate
и увеличивайте его,read
как предложено здесь transnum.blogspot.ie/2008/11/…источник
/usr/local/share/xfce4-keyboard-overlay
и каждый его подкаталог . Добавление-maxdepth 0
помогает.locate --regex --basename "xfce4-keyboard-overlay$" | xargs -I % sh -c "test -d % && echo %"
xargs
сfind
было хорошей идеей, я отредактировал его, чтобы сделать его устойчивым. Надеюсь, ты не возражаешь.xargs
будет повторять команду для каждой строки, если вы укажете-L 1
или-i
параметр.Посмотреть здесь
Надо признать, что он запускает новую оболочку для каждого файла, но он имеет преимущество в том, что он приятный и компактный.
РЕДАКТИРОВАТЬ: я не был очень доволен этим ответом, потому что это пиная новую оболочку для каждого файла. Это должно иметь только два процесса:
Конечно, было бы неплохо, если бы мы вообще могли не пинать интерпретатора, но,
xargs
похоже, его возможности ограничены в цепочке команд.источник
/home/evil/$(reboot)/xfce4-keyboard-overlay
и я по глупости запустил его какroot
).Мои два цента:
Это более или менее так, как G-Man сделал это в сочетании с заменой процесса.
источник
Что делать, если вы сочетаете
locate
сfile
иgrep
? ...источник
file
для каждого отдельного пути. Обратите внимание, что часто есть много строк результатов для поиска. Мой текущий тест ищет "gnome", давая около 73000 путей для тестирования.$f
файлаfile
программа откроет этот файл и прочитает его . Это очень дорого, когда все, что вам нужно сделать, этоstat()
. ………… Кроме того, это даст неправильные результаты для файлов, которые содержат «каталог» в своих именах (например, «phone_directory»). …………… (Кроме того,for f in `…`; do …
синтаксис не может обрабатывать имена, содержащие пробелы.)