나는 잘 작동하는 FTP 계정(감옥된 가상 사용자가 있는 vsftpd)을 생성하기 위한 자동화된 시스템을 가지고 있지만 여전히 사용되지 않는 계정을 수동으로 정리하는 데 의존하고 있습니다.
오래된 계정에 대한 나의 정의는 30일 미만의 파일이나 폴더가 포함되어 있지 않은 계정입니다.
지금까지 나는 이것을 실행할 수 있습니다 :
find /home/vsftpd -ctime +30 |awk -F'/' '{print $4}' |sort -u
그러면 폴더가 포함된 목록이 표시됩니다.마지막 하나30일이 지난 문서. 또한 -ctime -30
필요한 정보를 얻기 위해 목록을 부정하는 무거운 루프를 실행하고 수행 할 수도 있습니다 .
(적당히 합리적인) 단일 라이너로 이 작업을 수행할 수 있는 방법이 있었으면 좋겠지만 이 시점에서 내 find-foo는 실패합니다. 누구든지 도와줄 수 있나요?
답변1
나는 (GNU find를 사용하여) 다음과 같은 일을 할 것입니다:
cd /home/vsftpd &&
for i in */; do
if ! find "./$i" -ctime -30 -print -quit | grep -q .
echo no file touched in the past 30 days in "$i"
fi
done
(계정이 /home/vsftpd보다 한 수준 아래에 있다고 가정)
zsh 사용:
stale() (: $REPLY/**/*(NDm-30e:'exit 1':))
cd /home/vsftpd &&
echo those are stale: *(/+stale)
답변2
단일 라이너를 원하면 zsh를 사용하십시오. 대부분의 고급 용도와 마찬가지로 약간 신비합니다.글로벌 예선.
echo *(/e\''set -- $REPLY/**/*(Nm-30[1]); ((!$#))'\')
외부 glob은 작은따옴표( ) 안의 표현식이 참이 되도록 디렉터리( )에만 일치합니다 /
. e
이 표현식은 일치하는 디렉터리( )를 사용 하고 $REPLY
해당 디렉터리( )에서 **/
지난 30일 동안 수정된 파일( )을 찾습니다. m-30
일치하는 파일이 없으면( ) 오류가 발생하지 않고 N
첫 번째 일치( [1]
)만 유지합니다. 일치하는 항목이 없으면 표현식은 true입니다.
또 다른 접근 방식은 최근 파일이 포함된 디렉터리를 나열한 다음 목록의 보완을 취하는 것입니다.
comm -13 <(find . -mtime -30 | sed -e '/^\.$/ d' -e 's~^\./~~' -e 's~/.*~~' | sort -u) \
<(find . -type d -name . -o -prune -print | sed -e 's~^\./~~')