30일 이내의 콘텐츠가 포함된 최상위 폴더 목록

30일 이내의 콘텐츠가 포함된 최상위 폴더 목록

나는 잘 작동하는 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~^\./~~')

관련 정보