Улучшение производительности скрипта с помощью find и exec [закрыто]

Я нашел решение. В CentOS7 есть файрволл.

После выполнения следующих команд веб-страница становится доступной в хост-системе.

firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
2
10.01.2019, 21:16
1 ответ

Если вы установите переменную в действии find's -exec, это не будет видно.

Тот факт, что findнашел файл и напечатал его имя, достаточен, чтобы решить, что вы не хотите архивировать каталог. Таким образом, вам не нужен цикл for file in $files, вместо этого проверьте, что $filesне пусто.

Если ваша команда findподдерживает действие -quit, вы можете использовать его для остановки после первого совпадения. (см. Как остановить команду поиска после первого совпадения?)

Вместо того, чтобы помещать вывод первого findв переменную и использовать цикл for с разбиением слов, вам лучше прочитать вывод findпо очереди.

#!/bin/bash
# find all the directories
# -mindepth 1 prevents "find" from printing "."
find. -mindepth 1 -type d | while read -r dir
do
    # a subdirectory might no longer exist if a parent has been archived before
    if [ -d "$dir" ]
    then
        # search any new file in the directory
        newfilefound=`find $dir -type f -atime -30 -print -quit`

        if [ -z "$newfilefound" ]
        then
            tar -zcvf $dir.tgz $dir
            rm -r $dir
        fi
   fi
done

Если вы используете bash, вы можете улучшить первый find, чтобы правильно обрабатывать больше имен каталогов со специальными символами:find. -type d -print0 | while IFS= read -r -d '' dir; do...

По-прежнему существует проблема с производительностью:

Если каталог содержит новый файл где-то в подкаталоге, вы не удаляете его. Позже вы получите все имена подкаталогов до имени с этим файлом. В этом случае вы будете использовать findнесколько раз, чтобы найти один и тот же новый файл.

Единственное решение, которое приходит мне на ум, это использовать два find, некоторую пост--обработку и одинfgrep:

  1. Пусть один findнапечатает имена всех новых файлов, обработает вывод, удалив имена файлов, распечатав все родительские каталоги в виде отдельных строк, удалив дубликаты и поместив список в файл NEWDIRS.
  2. С помощью второго findвывести все имена каталогов во второй файл ALLDIRS.
  3. Используйте fgrep, чтобы найти все строки из ALLDIRS, которые не соответствуют строке в NEWDIRS.

Перед удалением каталога следует убедиться, что команда tarвыполнена успешно.

0
27.01.2020, 22:29

Теги

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