#bash #shell #unix #locate
#bash #оболочка #unix #locate
Вопрос:
Из оболочки Unix.
Я хочу найти файл, специально используемый locate <filename>
, а затем скопировать файлы, которые были расположены с помощью cp
. Я пробовал что-то вроде:
Locate -name "*.doc" -exec cp {} /path/to/copy/to
Комментарии:
1. Putty не имеет значения. Использование оболочки одинаково независимо от способа подключения.
2. Вам нужно поставить
;
в конце-exec
параметров.3.
locate
все в нижнем регистре. Очень немногие команды Unix имеют заглавные буквы в названии.4. Ваши аргументы за
find
, а неlocate
.5.
find . -name "*.doc" -exec cp {} /path/to/copy/to ;
Ответ №1:
Если вы хотите выполнить действия с файлами-путь, найденный базой данных locate, у locate
команды нет -exec
возможности выполнить команду для расположенных файлов ( -exec
существует для find
команды).
При работе с командой Locate database locate
:
- Вероятно, вы хотите найти по базовому имени, а не по всему пути; так что используйте
-b '*.doc'
. - Вы хотите, чтобы шаблон был заключен в одинарные кавычки, чтобы он не расширялся текущим интерпретатором оболочки, а только
locate
командой. - Вы хотите, чтобы найденные файлы действительно существовали, поэтому используйте
-e
переключатель. - Вам нужен
null
список записей с разделителями, чтобы можно было безопасно перебирать пути, даже если он содержит непечатаемые специальные символы, пробелы, новые строки, табуляции… - Поскольку
locate
не имеет прямого средства для выполнения команды с аргументами, вы будете передавать поток выводаxargs
, чтобы сделать это вместо этого.
locate -0eb '*.doc' |
xargs -0
sh -c 'cp -- "$@" /path/to/copy/to/' _
Пояснения:
locate -0eb '*.doc'
: Использование базы данных locate; найдите файлы, которые все еще существуют прямо сейчас, имея базовое имя, соответствующее*.doc
шаблону, и выведите список вnull
виде списка путей с разделителями.| xargs -0
: Передайтеnull
список путей с разделителямиxargs
, чтобы передать записи в качестве аргумента следующей команде.sh -c
: Выполните следующий встроенный сценарий оболочки.cp -- "$@" /path/to/copy/to/'
: Встроенный сценарий оболочки, который копирует все полученные пути в массив аргументов$@
/path/to/copy/to/
.
Наконец, обратите внимание на некоторые ключевые различия между locate
и find
:
locate
использует базу данных для ссылки на файлы в системе. Существует запрограммированноеcron
задание для обновления базы данных Locate (обычно один раз в день/etc/cron.daily/mlocate
, например, вызывая скрипт).locate
из-за этого он работает быстро, но также не может найти последние файлы, пока не обновит свою базу данных.find
прямой доступ к файловой системе. Он рекурсивно обходит каталоги и определяет типы конечных точек файлов / путей. Он также имеет больше опций и возможностей, таких как передача путей в качестве аргументов и выполнение команд.
Для дальнейшего чтения см.: SuperUser.com : В чем разница между «locate» и «find» в Linux?
Комментарии:
1. Я ценю ваш ответ и объяснение. Я попробовал это и получил следующую ошибку
2. отсутствует код ошибки @yakshpatel. Хотя команда
locate
илиxargs
, доступная для вашей системы, может отличаться параметрами, особенно доступными для macOS. Возможно, вам потребуется адаптировать мой ответ после прочтения справочных страниц дляlocate
xargs
вашей системы и доступных в ней.