지난 24시간 동안 수정된 모든 파일을 찾는 명령을 만들려고 하는데, 각 public_html 디렉터리를 통과하는 루프가 있는 PHP일 뿐이며 매일 확인할 수 있도록 출력을 HTML 파일에 저장합니다.
for i in `ls /var/cpanel/users`;
do find /home/$i/public_html -type f -ctime -1 -exec ls -ls {} \; >
/home/demo4/public_html/output.html;
done;
하지만 작동하지 않고 출력이 올바르지 않습니다. 이는 1개 계정에 대한 출력이므로 모든 계정에서 작동해야 합니다.
0 -r-xr-xr-x 1 ziaengg ziaengg 0 Jan 12 15:16 /home/ziaengg/public_html/modules/mod_rsflashmatic/xml/rsflashmatic_93.xml 23320 -rw-r--r-- 1 ziaengg ziaengg 23851008 Jan 12 15:25 /home/ziaengg/public_html/error_log
또한 결과를 특정 ID로 이메일로 보내는 방법도 알고 싶습니다.
키워드가 포함된 파일을 제외하려면 어떤 매개변수를 추가해야 합니까 cache
? 나는 이것에 정말로 새로운 것입니다.
답변1
노력하다:
cd /var/cpanel/users &&
for i in *
do
find "/home/$i/public_html" -type f ! -iname '*cache*' -ctime -1 -ls
done > /home/demo4/public_html/output.html
노트:
>>
대신 사용하십시오>
. 그렇지 않으면 각 반복이 마지막 출력을 덮어씁니다. 또는 전체 루프의 출력을 리디렉션하는 경우>
.- 일부 구현에는 와 매우 유사한 옵션이
find
있으므로 가능한 경우 이를 사용하십시오.-ls
-exec ls -ld {} \;
- 연산자를 사용
!
하여 검색을 무효화합니다.! -iname '*cache*'
find
비표준-iname
조건자를 지원하지 않는 경우-name '*[cC][aA][cC][hH][eE]*'
대신 해당 조건자를 사용하세요.- 이는 사용자 이름이므로 사용할 수
for i in $(ls ..)
있지만더 안전한사용for i in *
.
답변2
zsh
GNU 시스템에서는 다음을 사용 uconv
합니다 recode
.
{ echo '<html><head><meta charset="UTF-8"</head><body><pre>'
users=(/var/cpanel/users/*(:t)) &&
find /home/$^users/public_html -type f -ctime -1 ! -iname '*cache*' -ls |
uconv --from-callback escape-c -f utf8 -t utf8 |
recode u8..html
echo "</pre></body></html>"
} > /home/demo4/public_html/output.html
recode
(단 , U+FFFF 이상의 문자는 지원되지 않으니 주의하세요 )
<
문자 또는 8비트 바이트 값을 포함하는 파일 이름과 관련된 문제를 방지하려면 이러한 추가 uconv/recode 단계가 필요합니다 &
(여기서는 파일 이름이 UTF-8로 인코딩된 것으로 가정합니다(잘못된 문자의 경우 해당 바이트 값을 로 표시 \xAB
).