그래서, Barmar`s answer 거의 권리입니다 (이 스크립트는 7 일마다 크론에 의해 실행),하지만 파일을 올바르게 계산하지 않습니다. 나는 다른 비슷한 질문을 둘러 보았고 일반적인 실수 인 것처럼 보였다. (그의 해결책은 중요하지 않지만 대부분의 사람들이 그렇게하지 않기 때문에 다른 프로그래머와 접촉하는 것을 혼란스럽게 할 수있다. expect), 아무도 파일 이름에 개행 문자가 포함될 수 있다는 사실을 알지 못합니다. 여기에 적절한 파일 수를 제공하는 조금 더 나은 버전이 있습니다 :
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
없이이 코드를 실행하면 홈 폴더의 경우 몇 시간에서 1 초 미만까지 상당한 차이가 있음을 알 수 있습니다. (필자도 내 PC에서 파일을 완성 할 수 있을지 모르겠다. 내 홈 폴더에 수백만 개의 작은 파일이있다 ...)
왜 파일을 올바르게 계산해야합니까? 중요한 것은 0 또는 0이 아닙니다. – Barmar
@Barmar 끝까지 내 대답을 정말로 읽었습니까? 그렇습니다. 그러나 많은 프로그래머는 맹목적으로''wc -l''이 정확한 수의 파일을 제공 할 것이라고 생각할 수도 있습니다. 그래서 나는 이것을 분명히하고 싶었습니다. (그리고 파일을 세는 올바른 해결책은 거의 없습니다.) 나중에, 내 대답의 끝에서, 나는 적어도 하나의 파일이 있는지 더 나은 해결책을 제시했다. –
다행스럽게도'find'는 출력을 버퍼링하지 않거나, 그 해결책은 종료하기 전에 많은 파일을 조사합니다. – Barmar