locate
Кажется, find
слишком медленный для этого приложения.
Существует более быстрый инструмент для поиска файлов,locate
. Он использует базу данных, которую необходимо обновить для locate
, чтобы найти самые новые файлы.
updatedb
создает или обновляет базу данных, используемую locate
. Если база данных уже существует, ее данные используются повторно, чтобы избежать повторного чтения каталогов, которые не изменились.
Этот процесс обновления очень быстрый по сравнению с find
, и при обновлении базы данных locate
найдет все файлы (и намного быстрее, чемfind
).
Создать и в следующий раз обновить базу данных
sudo updatedb
Найдите соответствующие файлы.locate
предоставляет несколько полезных опций, но не так много опций, как find
. Возможно, вы сможете разработать полезный шаблон для своих целей.
Я предлагаю две командные строки, которые вы можете изменить, а затем объединить с scp
или rsync
.
Вы можете ограничить количество файлов с помощью--limit
Если вы ищете только в /path/from/
, а не в подкаталогах -
locate --regex --limit 1000 '/path/from/A.*random.*'
Если искать не в самом /path/from/
, а в его подкаталогах -
locate --regex --limit 1000 '/path/from/.*/A.*random.*'
Подробнее см. man locate
.
Возможно, вам следует изменить способ записи и хранения этих файлов, например, с несколькими подкаталогами -, чтобы в каждом каталоге не было слишком много файлов, например один подкаталог -для каждой даты (2019-02-12
. ], 2019-02-13
... ),
или даже лучше, как многие менеджеры фотографий хранят файлы изображений,
Возможно, вы также можете удалить некоторые файлы (, например, когда они становятся слишком старыми ).
Обычно ls
не печатает имена файлов, начинающиеся с точки. С -a
да, но сюда входят .
и ..
, которые существуют во всех каталогах и, следовательно, не очень интересны. С -A
он печатает все, кроме этих двух.
$ touch normal.hidden
$ ls
normal
$ ls -a
./ ../ .hidden normal
$ ls -A
.hidden normal
В этом операторе if -подстановка команды $(.. )
захватывает вывод ls
, а [[ -z... ]]
проверяет, является ли это пустой строкой. То есть в каталоге нет файлов.
Обычно чтение вывода ls
не является хорошей идеей, если вы хотите перебирать файлы в оболочке, вы можете просто использовать *
. Здесь это должно работать, за исключением того факта, что если данное имя каталога содержит пробелы (или символы имени файла ), они будут расширены в командной строке ls
, что может испортить Результаты.
См.: