5

(Медленная) команда Linux «find» имеет опцию «-ls» для отображения размера, даты и т.д., Как команда «ls -l». Но команда «найти», похоже, не имеет этого. Так как же получить эквивалентную функциональность с помощью locate?

Я использовал back-ticks, чтобы передать вывод locate в ls, вот так:

ls -al `locate -e somefile`

... который работает, пока существует какой-то файл. Но если некоторый файл не существует, он дает мне полный список каталогов.

Если я сделаю это:

ls -al `locate -e somefile` thisfileneverexists

... тогда это работает, если вы не возражаете против строки ошибки:

ls: cannot access thisfileneverexists: No such file or directory

... что приводит нас к очевидному, но крайне уродливому обходному пути:

ls -al `locate -e somefile` thisfileneverexists 2>/dev/nul

Это работает, но, безусловно, есть лучший способ!

3 ответа3

11

Используйте xargs . Он принимает в качестве входных данных ряд параметров и выполняет над ними операцию:

 locate -eb0P somefile | xargs -r0 ls -ald

xargs выполнит команду ls -ald используя результаты поиска в качестве параметров.

-e указывает locate проверить, что файлы, найденные в базе данных, действительно существуют, и игнорировать все файлы, которые не существуют.

-b указывает locate соответствовать только базовым именам.

-0 (ноль) указывает locate генерировать нулевые разделители вместо пробелов (поэтому он может обрабатывать имена файлов, которые содержат пробелы)

-P указывает locate перечислить битые символические ссылки

Ключ -r указывает xargs не выполнять команду, если ничего не передано, т.е. когда locate ничего не возвращает.

Ключ -0 указывает xargs ожидать нулевые значения вместо пробелов в качестве разделителей

-a указывает ls выводить список даже файлов, начинающихся с "."

-d указывает ls перечислять каталоги, а не их содержимое

3

Сохраните результат locate в переменной, проверьте, имеет ли оно какое-либо значение, а затем просмотрите его.

f=`locate ...`
[ "$f" ] && ls -al "$f"

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

0

Вы также можете перебрать вывод locate :

locate somefile | while IFS= read -r i; do ls -la "$i"; done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .