폴더에서 파일 만료 : x 일 후 파일 삭제


12

모든 사람이 액세스 할 수있는 Windows 공유 드라이브에서 "드롭 폴더"를 만들려고합니다. 파일이 X 일 이상 폴더에 있으면 자동으로 파일을 삭제하고 싶습니다.

그러나 내가 찾은 모든 방법, 마지막 수정 날짜, 마지막 액세스 시간 또는 파일 작성 날짜를 사용하는 것처럼 보입니다.

이 폴더를 사용자가 다른 사용자와 공유하기 위해 파일을 놓을 수있는 폴더로 만들려고합니다. 누군가 파일을 복사하거나 여기로 옮기면 시계가이 시점에서 똑딱 거리고 싶습니다. 그러나 누군가 파일을 실제로 수정하지 않으면 파일의 마지막 수정 날짜 및 작성 날짜가 업데이트되지 않습니다. 마지막 액세스 시간이 너무 자주 업데이트됩니다 ... Windows 탐색기에서 디렉토리를 열면 마지막 액세스 시간이 업데이트되는 것 같습니다.

누구든지 이것에 대한 해결책을 알고 있습니까? 매일 파일 해시를 카탈로그 화 한 다음 특정 날짜보다 오래된 해시를 기반으로 파일을 만료하는 것이 해결책 일 수 있다고 생각합니다 ...하지만 파일 해시를 가져 오는 데 시간이 오래 걸릴 수 있습니다.

어떤 아이디어라도 대단히 감사하겠습니다!

참고 :
나는 이미 여기에 많은 답변을 보았습니다 ... 파일 서버 리소스 모니터, powershell 스크립트, 배치 스크립트 등을 살펴 보았습니다. 여전히 마지막 액세스 시간, 마지막 수정 시간 또는 생성 시간을 사용합니다 ... 전술 한 바와 같이, 상기 요구에 맞지 않는다.


@Michael Kjorling이 언급 한 한 가지 질문은 파일을 상자에 넣은 후 수정하면 타이머 계산을 중지합니까?
Get-HomeByFiveOClock

당신이 찾고있는 것은 Windows와 동등한 것입니다 tmpwatch.
에이버리 페인

답변:


5

우리는 powershell 스크립트와 정책의 조합을 사용했습니다. 이 정책은 사용자가 Drop_Zone 공유 내에 폴더를 만든 다음 원하는 파일을 해당 폴더에 복사하도록 지정합니다. 폴더가 7 일이되면 (CreationTime 사용) powershell 스크립트가 폴더를 삭제합니다.

또한 powershell 스크립트에 로깅을 추가하여 작동 여부를 확인하고 섀도 복사본을 켜서 완전히 부적절하게 저장했습니다.

다음은 모든 로깅 항목이없는 스크립트입니다.

$location = Get-ChildItem \\foo.bar\Drop_Zone
$date = Get-Date
foreach ($item in $location) {
  # Check to see if this is the readme folder
  if($item.PsIsContainer -and $item.Name -ne '_ReadMe') {
    $itemAge = ((Get-Date) - $item.CreationTime).Days
    if($itemAge -gt 7) {
      Remove-Item $item.FullName -recurse -force
    }
  }
  else {
  # must be a file
  # you can check age and delete based on that or just delete regardless
  # because they didn't follow the policy
  }
}

1
이것은 가장 단순 해 보이거나 파일 날짜 시간 스탬프, 대체 데이터 스트림으로 퍼지되지 않거나 일부 파일 목록 및 삭제 날짜가 필요하지 않습니다. 나는 모든 종류의 마술을 한 멋진 스크립트를 만들려고했지만 이것을 보았습니다.
BeowulfNode42

스크립트가 하루에 한 번 실행될 수 있기 때문에 스크립트를 항상 트리거하는 파일 시스템 감시 이벤트가 필요하지 않으며 어떤 이유로 든 하루를 놓치더라도 그다지 중요하지 않습니다.
BeowulfNode42

2
@ BeowulfNode42가 지적한 것처럼 훌륭한 간단한 아이디어. 사용자가 폴더를 작성하도록하려면 "이 폴더 만"에 대한 "파일 작성 / 데이터 쓰기"ACL의 간단한 "거부"는 사용자가 하위 폴더도 작성해야합니다.
Brett G

3

NTFS를 가정 할 수 있으면 파일의 대체 스트림에 키 (Guid)를 쓸 수 있습니다. 날짜와 함께 기본적으로 데이터베이스를 파일에 저장할 수 있습니다.

자세한 내용은 다음을 참조하십시오.

http://blogs.technet.com/b/askcore/archive/2013/03/24/alternate-data-streams-in-ntfs.aspx

기본적으로 특별한 이름으로 코딩 된 별도의 스트림에 추가 컨텐츠를 저장할 수 있습니다.


어떻게하면 될까요?
Brett G

@BrettG 문서에 대한 링크가 추가되었습니다. "NTFS Alternate Data Stream"은 Google을 모르는 경우를 대비하여 Google에서도 찾을 수있었습니다.
TomTom

죄송합니다. 대체 데이터 스트림이 무엇인지 알고 있습니다.이 컨텍스트에서 사용법을 이해하려고했습니다. 따라서 해시 나 무언가를 사용하는 대신 대체 데이터 스트림에서 GUID (및 / 또는 날짜)를 사용하여 파일을 추적합니다 .. aha.
Brett G

네. 파일을 안정적으로 마크 할 수 있다면 (마킹 날짜도 넣을 수 있음) 해시를 계산할 필요가 없습니다.
TomTom

상점에서 파일이 복사되고 편집 된 후 다시 복사되는지 확인하십시오. 그런 다음 해시가 유용 할 수있는 타이머를 다시 시작하려고합니다.
CVn

2

IO.FileSystemWatcher를 사용하면 생성 된 새 파일의 폴더를 "감시"할 수 있습니다. 이 작업을 수행하는 데 필요한 부분은 다음과 같습니다.

이러한 변수는 감시 할 경로와 추적 할 파일을 미세 조정하기위한 필터를 구성합니다.

$watchFolderPath = $env:USERPROFILE
$watchFolderFilter = "*.*"

폴더가 감시 할 매개 변수와 이벤트 발생시 수행 할 조치를 설정합니다. 기본적으로 이것은 각 파일이 작성된대로 LastWriteTime을 재설정합니다.

$watcher = New-Object IO.FileSystemWatcher $watchFolderPath, $watchFolderFilter -Property @{
    IncludeSubdirectories = $true
    NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
    }
$onCreated = Register-ObjectEvent $watcher Created -SourceIdentifier FileCreated -Action {
    $FileName = $Event.SourceEventArgs.FullPath
    $file = Get-Item $FileName
    $file.LastWriteTime = Get-Date
    }

필요한 경우 다음을 사용하여 이벤트를 등록 취소 할 수 있습니다.

Unregister-Event -SourceIdentifier FileCreated

마지막으로 오래된 파일을 정리하기 위해 하루에 한 번 실행할 수 있습니다.

Get-ChildItem $watchFolderPath -Recurse | Where-Object {((Get-Date)-$_.LastWriteTime).TotalDays -gt 6} | Remove-Item

그게 당신이 필요로하는 모든 것이어야합니다 ...


파일을 작성할 때 LastWriteTime 속성을 설정 한 다음이를 사용하여 나중에 파일을 삭제하도록이를 편집했습니다.
Tim Ferrill

1

오랜 시간이 지났지만이 문제를 해결하기 위해 비교적 간단한 방법을 설정했습니다.

드롭 디렉토리에 추가 된 파일 (자원 모니터링 유틸리티를 통해 모니터링)을 터치하고 마지막으로 수정 한 날짜를 폴더에 추가 된 날짜로 설정합니다.

그런 다음 마지막 수정 날짜를 사용하여 오래된 파일을 제거 할 수 있습니다. 또한 누군가 파일을 실제로 업데이트하면 카운트 다운이 재설정된다는 장점도 있습니다.


완벽한 아이디어. 나는 내 자신의 연구를 할 것입니다. 그러나 어떤 리소스 모니터링 유틸리티를 사용했는지 아십니까?
Brett G

@BrettG 솔직히 거의 10 년 전이었습니다. 기억이 안나 넌 날 늙게 해 :) 오늘해야한다면 이벤트 뷰어에서 파일 시스템 감사 이벤트를 기반으로 작업을 실행합니다. FileSystemWatcher .NET 객체는 내가 생각하는 PowerShell을 통해 사용할 수 있습니다. 다른 옵션이 될 것입니다.
Tim Brigham

하, 나는 당신이 "한동안"이라고 말할 때 당신이 그렇게 오랫동안 의미한다는 것을 몰랐다. 예, FileSystemWatcher를보고있을 정도로 재미있었습니다. 비록 이동 / 복사 된 파일로는 작동하지 않을 것이라고 생각합니다. 답장을 보내 주셔서 감사합니다!
Brett G

1
@BrettG-Filesystemwatcher는 추적 테이블과 함께 사용될 수 있지만 자체 문제가 있습니다. 여기를보십시오 : stackoverflow.com/questions/1764809/… stackoverflow.com/questions/6000856/filesystemwatcher-issues
JohnP

1
@BrettG-또한 이것은 FSW의 좋은 확장입니다 : codeproject.com/Articles/58740/…
JohnP

1

파일을 복사하거나 폴더로 옮긴 날짜에 의존 할 방법이 없습니다. Windows는 파일 시스템, 드라이브, 네트워크 공유 등을 통해 파일을 보존합니다. Linux 파일 서버에서 문제를 해결하거나 사람들이 FTP 또는 웹 기반 업로드 시스템을 사용하여 파일을 직접 복사하지 못하게 할 수 있습니다.

사람들이 파일을 업로드 한 후 파일을 수정할 수없는 것이 괜찮다면, 별도의 업로드 및 액세스 폴더와 파일간에 파일을 이동하고 다시 업데이트하는 스크립트를 가질 수 있습니다. 그러나 사람들이 파일을 직접 수정할 수 있기를 원하는 것처럼 들립니다.

따라서 해킹이 쉽지만 간단한 해결책은 날짜를 망칠 것입니다. 두 개의 스크립트를 작성합니다.

시간별 날짜 변경자 스크립트

원하는 언어로 한 시간 정도 스크립트를 실행하십시오.

  • 지난 20 년 동안 날짜가 수정 된 파일을 찾습니다.
  • 이러한 파일을 찾으면 오늘에서 20 년을 빼고 수정 한 날짜를 변경하십시오.

powershell에서 다음과 같이 보일 것입니다.

$path = "D:\test"

$today = Get-Date
$before = $today.AddDays(-7300) #356*20 days

Get-ChildItem -Recurse -Path $path | foreach {
    if ($_.LastWriteTime -gt $before) {
        Write-Host $_.Name
        $_.LastWriteTime = $before
    }
}

오늘 (5 월 27 일)이 스크립트를 실행하면 모든 파일의 수정 날짜가 1994 년 6 월 1 일 (정확히 356 * 20 일)로 설정됩니다. $ before 값보다 새로운 파일 만 변경하므로 이미 과거로 설정 한 파일은 건드리지 않습니다.

정리 스크립트

정리 스크립트는 매일 밤 실행되며 다음과 같습니다.

  • "20 년 X 일 전에"수정 한 날짜의 파일 검색
  • 그들을 삭제

이 부분에 대한 스크립트는 작성하지 않겠습니다. 지정된 날짜보다 오래된 파일을 삭제하고 처리 할 수있는 유틸리티가 많이 있습니다. 중요한 부분은 7300 + X 일이 지난 파일을 찾는 것입니다. 여기서 X는 파일을 마지막으로 수정 한 후 유지할 일 수입니다.

장점

여기에 다른 답변보다 몇 가지 장점이 있습니다.

  • 누군가 파일을 수정하면 타이머가 재설정됩니다.
  • NTFS 대체 스트림이 파일을 표시 할 필요가 없습니다 (파일을 이동할 때 유지되므로 수정 된 파일을 조기에 삭제할 수 있음)
  • 성능에 영향을주는 경우 최소화해야합니다. 데이터베이스 나 파일 이름 및 / 또는 해시 목록을 유지할 필요가 없습니다.
  • 스크립트가 실행되지 않으면 아무것도 깨지지 않습니다. 날짜를 업데이트하는 데 필요한 서비스 또는 지속적으로 실행되는 프로그램이 없습니다. 몇 가지 예약 된 작업. 새 파일을 감시하고 마지막으로 수정 한 시간을 업데이트하는 솔루션은 서비스가 실패하거나 경쟁 조건에 처할 경우 새 파일을 삭제하게됩니다.

내가 볼 수있는 유일한 문제는 사람들이 20 년 전에 마지막으로 수정 된 파일을 드롭 폴더에 복사하는 경우입니다. 나는 대부분의 시나리오에서 그다지 큰 문제는 아닐 것이라고 생각하지만 일어날 수 있습니다.


0

"업로드"IFRAME이있는 웹 페이지를 통해 드롭 박스에 파일 추가를 공식화 할 수 있습니다. 그런 다음 사용자는 파일을 "게시"하여 서버에서 PHP / ASP 작업을 호출하여 파일을 가져 와서 pucker 위치에 배치합니다. PHP / ASP는 여러 인덱스 / 분석 작업을 수행 할 수 있습니다.


0

누군가 파일을 복사하거나 여기로 옮기면 시계가이 시점에서 똑딱 거리고 싶습니다. 그러나 누군가 파일을 실제로 수정하지 않으면 파일의 마지막 수정 날짜 및 작성 날짜가 업데이트되지 않습니다.

5 분마다 예약 된 작업으로 실행되고 두 가지 작업을 수행하는 스크립트를 작성합니다.

  1. 첫 번째 조치는 파일을 폴더에 복사하고 파일에 접 두부를 붙이고 원본을 삭제하는 것입니다. 이렇게하면 파일 작성 날짜가 응용 프로그램에 대해 일정하게 유지됩니다.
  2. 두 번째 작업은 미리 결정된 접두사가있는 모든 파일 (작업 1로 설정)을보고 X 일보다 오래된 생성 날짜를 가진 파일을 삭제합니다. 이것은 수정 / 접근 날짜 문제를 해결합니다.

0

파일을 표시하는 기존 메커니즘 인 보관 비트가 있습니다. DOS 초기부터 존재했으며 FAT와 NTFS 모두에 존재합니다.

기본적으로 모든 파일에는 기본적으로 보관 비트가 설정되어 있습니다. 드롭 폴더에 보관 비트가 있는 파일 있으면 (1) 해당 비트를 지우고 (2) 날짜를 오늘로 설정하십시오. 당신이 파일이 있으면 없이 그 비트 및 날짜 <= 지난 7 일로, 삭제합니다.

드롭 폴더에있는 동안 사용자가 파일에 쓰면 보관 비트가 다시 설정되므로 수명도 7 일로 재설정됩니다. 결국 새로운 파일입니다.

이제 FileSystemWatcher를 안전하게 사용할 수 있습니다. 관련 정보가 모두 파일 메타 데이터에 있으므로 중복 이벤트, 상세 정보 손실 버퍼 오버 플로우와 같은 문제는 더 이상 중요하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.