Как вывести информацию о файле (размер, дату и т. Д.) Из команды Linux «найти»?

37729
Dave Burton

(Медленная) команда 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 

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

5

3 ответа на вопрос

11
Paul

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

 locate -eb0P somefile | xargs -r0 ls -ald 

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

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

-bПереключатель указывает местонахождение, чтобы соответствовать только basenames.

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

-PПереключатель указывает местонахождение в список битые симлинки

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

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

-aПереключатель указывает сберегательным список даже файлы, которые начинаются с «»

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

К сожалению, это нарушается для файлов с пробелами в именах, а также для имен каталогов, соответствующих шаблону. Это работает лучше: "locate -eb0 somefile | xargs -r --null ls -ald" Параметры означают: locate -e = сопоставлять только те файлы, которые действительно существуют -b = сопоставить базовое имя -0 = использовать нулевые разделители вместо пробелов xargs - -null = ожидать нулевые разделители вместо пробелов ls -d = список каталогов, а не их содержимое -a = список даже скрытых файлов (с именами, которые начинаются с ".") Dave Burton 11 лет назад 0
+1: это золото. Именно так я и хочу найти, чтобы работать, поскольку найти файл не всегда достаточно - определение даты и размера файла поможет отличить его от других. Manngo 6 лет назад 0
3
Ignacio Vazquez-Abrams

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

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

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

0
terdon

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

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

Похожие вопросы