Так, Barmar`s answer почти правильно, но это не правильно подсчитывать файлы. Я искал другие подобные вопросы, и кажется, что это распространенная ошибка (, пожалуйста, обратите внимание, что это не важно для его решения, но это может смутить других программистов, если они касаются этого, потому что это не то, что большинство людей будет ожидайте), никто не учитывает тот факт, что имена файлов могут содержать символы новой строки. Итак, вот немного лучшая версия, которая дает вам правильное количество файлов:
for i in */
do
fileCount=$(find "$i" -type f -mtime -8 -exec printf . \;)
if ((${#fileCount} > 0)); then
7za a -t7z /mnt/HD_a2/encrypted/ul_doc/"${i%/}.7z" -p1234 -mhe "$i"
fi
done
Но что, если у вас тысячи файлов? Это создаст строку, которая точно равна количеству ваших файлов.
Таким образом, мы можем использовать это:
for i in */
do
fileCount=$(find "$i" -type f -mtime -8 -exec printf . \; | wc -c)
if ((fileCount > 0)); then
7za a -t7z /mnt/HD_a2/encrypted/ul_doc/"${i%/}.7z" -p1234 -mhe "$i"
fi
done
Или это:
for i in */
do
fileCount=$(find "$i" -type f -mtime -8 -exec echo \; | wc -l)
if ((fileCount > 0)); then
7za a -t7z /mnt/HD_a2/encrypted/ul_doc/"${i%/}.7z" -p1234 -mhe "$i"
fi
done
Надеясь, что бесполезно строка данных не будет кэшировать.
Но нам нужно только знать, есть ли НА МЕНЬШИЙ один файл, мы не должны их считать! Таким образом, мы можем немедленно остановиться, если что-то найдено.
for i in */
do
fileFound=$(find "$i" -type f -mtime -8 | head -n 1)
if [[ $fileFound ]]; then
7za a -t7z /mnt/HD_a2/encrypted/ul_doc/"${i%/}.7z" -p1234 -mhe "$i"
fi
done
Всё. Это решение будет работать МНОГО быстрее, потому что ему не нужно искать другие файлы, и даже не нужно проверять их mtime
. Попробуйте запустить этот код без head
, и вы заметите существенную разницу - от нескольких часов до менее секунды для моей домашней папки. (Я даже не уверен, что когда-нибудь удастся закончить его на моем компьютере, у меня есть миллионы небольших файлов в моей домашней папке ...)
Зачем вам правильно подсчитывать файлы? Все, что имеет значение, равно нулю или не равно нулю. – Barmar
@ Бармар Вы действительно читали мой ответ до конца? Да, но многие программисты могут вслепую предположить, что '' wc -l'' даст им правильное количество файлов, поэтому я хотел уточнить это (и вы редко увидите это правильное решение для подсчета файлов). Позже, в конце моего ответа, я дал еще лучшее решение, чтобы увидеть, есть ли хотя бы один файл. –
К счастью 'find' не буферизует свой вывод, или это решение все еще будет проверять множество файлов перед выходом. – Barmar