Я нашел решение. В CentOS7 есть файрволл.
После выполнения следующих команд веб-страница становится доступной в хост-системе.
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
Если вы установите переменную в действии 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
:
find
напечатает имена всех новых файлов, обработает вывод, удалив имена файлов, распечатав все родительские каталоги в виде отдельных строк, удалив дубликаты и поместив список в файл NEWDIRS. find
вывести все имена каталогов во второй файл ALLDIRS.fgrep
, чтобы найти все строки из ALLDIRS, которые не соответствуют строке в NEWDIRS. Перед удалением каталога следует убедиться, что команда tar
выполнена успешно.