Есть ли способ использовать базу данных Locate для выполнения копирования в оболочке Unix?

#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 :

  1. Вероятно, вы хотите найти по базовому имени, а не по всему пути; так что используйте -b '*.doc' .
  2. Вы хотите, чтобы шаблон был заключен в одинарные кавычки, чтобы он не расширялся текущим интерпретатором оболочки, а только locate командой.
  3. Вы хотите, чтобы найденные файлы действительно существовали, поэтому используйте -e переключатель.
  4. Вам нужен null список записей с разделителями, чтобы можно было безопасно перебирать пути, даже если он содержит непечатаемые специальные символы, пробелы, новые строки, табуляции…
  5. Поскольку 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 вашей системы и доступных в ней.