다시 시작하기 전에 생성/수정/액세스된 파일을 어떻게 찾나요?

다시 시작하기 전에 생성/수정/액세스된 파일을 어떻게 찾나요?

원격 시스템(저는 관리자가 아님)에서 TMPDIR".profile"에 대안을 구성했습니다(시스템 기본 공간이 매우 제한되어 있기 때문입니다).

TMPDIR물론 이 대안은 재부팅 시 지워지지 않습니다. 그래서 주기적으로(또는 로그인 시) 디렉토리를 지우고 싶습니다. 다만, 로그인을 하지 않은 상태에서는 장시간 실행되는 스크립트를 사용하여 여러번 로그인이 되는 경우가 있어서 rm실제로는 전부 선택할 수는 없습니다.

bash가장 최근 재부팅 이전의 특정 디렉터리에서 파일을 찾아 정리할 수 있는 방법(바람직하지만 일반적인 도구를 사용할 수 있음)이 있습니까 TMPDIR?

답변1

Thomas의 답변과 동일하지만 /proc/stat의 btime 필드를 사용하여 시작 시간을 찾는 더 쉬운 방법

$ DT=$(awk '$1 ~ /btime/ { print "print scalar localtime("$2")" }' /proc/stat|perl)
$ echo $DT
Fri Nov 13 15:04:28 2015
$ last reboot|head -1
reboot   system boot  3.16.0-4-amd64   Fri Nov 13 15:04 - 22:53 (5+07:49)  
$ touch -d "$DT" /tmp/foo

-newer 옵션과 함께 find를 사용하세요.

답변2

이 간단한 줄은 TMPDIR마지막 재부팅 전에 수정된 모든 파일과 디렉터리를 제거하는 데 도움이 될 수 있습니다.

$ find $TMPDIR -mindepth 1 -depth -not -newermt "$(uptime -s)" -delete

귀하의 컴퓨터는 이 기능을 지원해야 하며 이 기능이 작동하려면 옵션이 uptime -s있어야 합니다 .find-newerXY

이는 (t)타임스탬프(이 경우 출력)를 참조한 후 (m)수정된 파일 및 디렉터리를 찾는 -newermt특별한 형식입니다 .-newerXYuptime -s

보다find수동세부사항 -newerXY.

수정된 파일을 찾으려면 -not역 검색을 사용하세요 .-newermt앞으로또는 마지막 재부팅 이후가 아닌 정확히 마지막 재부팅 시점에.

-depth디렉터리 자체보다 디렉터리 내용을 처리하는 데 관심이 있습니다(재귀 삭제에 중요).

-mindepth 1TMPDIR디렉토리 자체가 보존되는지 확인하십시오 .

네가 원한다면목록해당 파일을 삭제하는 대신 -delete.

나열하고 싶다면그리고삭제하려면 추가하기만 하면 됩니다 -printf "%p\n" -delete.

답변3

이 주석은 uptime -s최근에 나타났습니다(Linux 특정 코드에 나타남).2012년 말).

last시스템 부팅 타임스탬프를 나열하는 출력을 사용하는 것이 더 이식성이 있을 수 있습니다 .

tom      pts/0        michener.jexium- Wed Nov 18 17:00   still logged in
reboot   system boot  3.2.0-4-amd64    Wed Nov 18 16:47 - 20:36  (03:49)
tom      pts/0        michener.jexium- Wed Nov 18 04:12 - down   (01:21)
reboot   system boot  3.2.0-4-amd64    Wed Nov 18 04:04 - 05:33  (01:29)
tom      pts/0        michener.jexium- Tue Nov 17 17:03 - down   (04:24)

그리고 (grep 또는 awk를 사용하여) 가장 최근의 "restart" 라인의 타임스탬프를 얻고 다음을 사용합니다.저것touch예를 들어 매개변수로

LAST=$(last | grep -E '^reboot ' | sed -e 's/^.\{39\}//' -e 's/\(.\{16\}\).*/\1/' | head -n 1)

-newer그러면 다음과 같은 옵션이 제공됩니다.find, 그리고 하루 중 몇 분만에 다시 시작 시간을 완료합니다.

FILE=/tmp/foo
touch -d "$LAST" $FILE
find $MY_TMPDIR ! -newer $FILE -exec echo rm -rf {} \;

물론 약점은 다음 형식을 이해하는 것입니다.last출력(그러나 표준은 없음저것).

답변4

uptime다음은 출력을 구문 분석하고 , 시작 이후 총 시간(분)을 계산하고, 몇 분 전에 수정된 파일을 찾는 스크립트입니다 . 저는 이것을 FreeBSD 10.2, Debian Jessie 8 및 Ubuntu Trusty 14.04에서 테스트했습니다. uptime다른 시스템의 출력 형식 에 대해서는 잘 모르겠습니다 .

그 핵심에는 다른 명령과 함께 사용하기 위해 그리고 가동 시간(분)을 알아야 하는 상황에서 명령 파일에 별도로 배치할 수 있는 함수 awk내의 스크립트가 있습니다(최대 1분 이내).uptime_minutesfind

파일에 저장하고 실행합니다. sh filename directory ...여기서 는 filename스크립트에 대해 선택한 이름이고 는 directory검색하려는 디렉터리입니다.

    #!/bin/sh

    uptime_minutes() {
        uptime |
        awk '
            {
                for (i=1; i<=NF; i++) {
                    if ($i == "up") {
                        split($(i+3), hhmm, "[:,]")
                        print ($(i+1) * 24 * 60) + (hhmm[1] * 60) + hhmm[2]
                        exit
                    }
                }
            }
        '
    }
    find "${@:?}" -mmin +$(uptime_minutes) # -exec rm {} \;

"${@:?}"디렉토리 매개변수를 제공하지 않으면 오류와 함께 인쇄됩니다.

파일 삭제 코드는 마지막에 주석 처리되어 있습니다. #파일 이름을 인쇄하는 대신 실제로 파일을 삭제하려면 삭제하면 됩니다.

관련 정보