Windows 재귀 터치 명령


17

Windows 7에서 날짜 / 시간 스탬프를 업데이트하기 위해 디렉토리 (하위 디렉토리 포함)의 모든 파일을 재귀 적으로 터치하려면 어떻게해야합니까?

Windows 7에는이를 수행 할 수있는 메커니즘이 있습니까?



해당 링크에서 "허용 된"대답은 .NET 프로그래밍 라이브러리를 사용하여 하나의 파일에 대해 수행하는 것입니다. 다른 하나는 단일 파일을 업데이트하기 위해 컨텍스트 메뉴를 추가하는 것에 관한 것입니다. N 파일에 재귀 적으로 수행 할 수있는 내장 명령을 찾고있었습니다. 아래의 대답은 모든 파일에 대해 효과적이었습니다. 내장 기능은 아니지만 작동합니다. 감사.
jmq

이 질문은 재귀를 특별히 요구하기 때문에 Windows 버전의 Unix touch 명령의 복제본도 아닙니다 . 그러나 해당 질문에 대한 몇 가지 답변은 재귀적인 형식입니다.
JdeBP

답변:


19

몇 가지 가능성이 있습니다.

  • 유닉스의 포트를 사용하여 touch명령을 단순히 결합 findtouch유닉스 방식이다. 몇 가지 선택이 있습니다. GNUWin32 , cygwinunxutils종종 언급됩니다 . 덜 알려져 있지만 더 나은 어떤면에서의 도구 SFUA 유틸리티 툴킷 에서 실행, UNIX 기반 응용 프로그램 용 하위 시스템 윈도우 7 얼티밋 에디션 및 Windows Server 2008 R2와 함께 상자에 바로 제공됩니다. (Windows XP의 경우, Services for UNIX 버전 3.5를 다운로드 하여 설치할 수 있습니다 .)이 툴킷에는 Korn 및 C 쉘 에서 다음 과 같은 다양한 명령 행 TUI 도구 가 있습니다.mvduperl그리고 awk. x86-64와 IA64 맛뿐만 아니라 x86-32로도 제공됩니다. 이 프로그램은 에뮬레이터 DLL (예 cygwin1.dll:)을 Win32보다 계층화 하지 않고 Windows의 고유 한 적절한 POSIX 환경에서 실행 합니다. 그리고 네, 툴킷은 가지고 touchfind,뿐만 아니라 일부 (300) 등이 있습니다.
    이러한 모든 툴킷은 물론 모든 파일을 만질 때마다 별도의 프로세스를 실행한다는 잘 알려진 단점이 있습니다. 다음과 같은 대안에는 문제가 없습니다.

  • touch사람들이 작성하고 게시 한 많은 기본 Win32 명령 중 하나를 사용하십시오 . 그들 중 많은 사람들이 유닉스 find를 감쌀 필요없이 재귀를 수행하는 옵션을 지원 합니다. (그들은이 모든 후, 찾고있는 userbase가 대상 touch이 포팅 유닉스 명령의 전체 부하가 없기 때문에 명령을 사용합니다.) 그 중 하나 인 스테판 Duguay의touch 당신이 가지고 볼 수있는 --recursive옵션을 선택합니다.

  • CMD의 신비한 신비로 영리하십시오. 다른 답변에서 언급했듯이 명령 COPY /B myfile+,,의 알려진 "플러스"구문을 사용하여 파일의 마지막 수정 날짜 스탬프를 업데이트합니다 COPY(자세한 내용은 여기서 우연히 찾을 수 있음 ). 이것은 물론 FOR /R다른 답변에서 암시 된 것처럼 재귀 적으로 작업을 수행하기 위해 결합 될 수 있습니다 .

  • 대체 명령 인터프리터를 사용하고 CMD보다 영리하고 단순합니다. JP Software의 TCC / LE 는 그러한 것 중 하나입니다. 그것은 추가 /S로 옵션 COPY명령을 하나를 사용할 수 있다는 것을 의미 COPY /SA에 대한 필요성 제거하기 위해 "플러스"구문 FOR래퍼. 그러나 TCC / LE에는 옵션 을 직접 지원하는 내장 TOUCH 명령이 있다는 점을 고려할 때 여전히 인생을 불필요하게 어렵게 만들고 /S있습니다.


2
하나는이 COPY /B file+,,갈 수있는 방법은, 아니 엑스트라를 필요로하지 않습니다 ... :-)
타마라 Wijsman

3
Powershell 방법 :(ls file).LastWriteTime = DateTime.now
Tamara Wijsman

5

그것들은 쉽게 구할 수 있으므로 unxutils 를 활용하는 것이 좋습니다 . 여기에는 findtouch명령이 포함되어 있어이를 매우 쉽게 수행 할 수 있습니다.

최상위 디렉토리로 변경 한 후 수정하십시오.

찾기 . -type f -exec touch {} +

5

기존 Windows 기능 만 사용하려면 (추가로 설치하지 않아도 됨) 다음 중 하나를 시도하십시오.

forfiles /P C:\Path\To\Root /S /C "cmd /c Copy /B @path+,,"  

(지정된 경로에서 시작하는 모든 파일을 재귀 적으로 "터치")

또는

forfiles /S /C "cmd /c Copy /B @path+,,"   

(현재 디렉토리에서 시작하는 모든 파일을 재귀 적으로 "터치")


3
-1이 명령은 하위 폴더에서 루트로 파일을 복사하므로 결과는 엉망입니다.
TonyG

1
@TonyG 고치기 +1의 작은 비틀림 상기 내용 : forfiles / S / C "cmd를 / C 복사 / B NUL : + ,,"
알렉스 Dupuis

변경되지 않음
beppe9000

4

나는 이것이 아마도 너무 늦다는 것을 알고 있지만 그럼에도 불구하고 다른 누군가가 같은 것을 필요로 할 경우를 대비하여 대답을 남길 것입니다.

John T의 대답은 Windows 7에서 나에게 도움이되지 못했습니다. 일부 연구 결과 SKTimeStamp 라는 유틸리티가 발견되었습니다.이 유틸리티는 완벽하게 작동합니다.

작동 방식에 대한 자세한 내용은 다음과 같습니다. http://www.trickyways.com/2009/08/how-to-change-timestamp-of-a-file-in-windows-file-created-modified-and -accessed / .

수행해야 할 단계는 다음과 같습니다.

  • 응용 프로그램 설치
  • 타임 스탬프를 변경해야하는 디렉토리로 이동
  • 탐색기가 모든 파일을 표시하도록 검색 상자에서 *를 검색하십시오.
  • 모든 파일을 찾았 으면 모두 선택하고 마우스 오른쪽 버튼을 클릭 한 후 속성을 선택하십시오.
  • 대화 상자에서 TimeStamps 탭을 선택하십시오
  • 필요에 따라 날짜와 시간을 조정하고 터치를 클릭하십시오

짜잔! 모든 파일이 업데이트되었습니다! 유닉스 유틸리티 나 명령 줄이 필요 없습니다.


1

또는 이미 "터치"도구가 있으면 Windows에 이미 내장 된 도구를 사용할 수 있습니다.

for /r %i in (C:\Path\To\Root\*) do @touch "%i"

또는

forfiles /P C:\Path\To\Root /S /C "touch @file"

(NB : 배치 파일에서이 작업을 수행하고 for명령 을 사용하려면 변수에 이중 백분율 기호를 사용해야합니다 (예 : %%i대신 %i)


1

그것은 나를 위해 Windows 7에서도 실패했습니다. 다른 구문을 사용하여 작동 시켰습니다.

forfiles /c "cmd /c touch @file"

참고로, 재귀 옵션을 사용하지 않았습니다.


1

Powershell 사용 :

C:\> powershell  (ls your-file-name-here).LastWriteTime = Get-Date

이것은 저에게 효과적이지 않습니다 :The property 'LastWriteTime' cannot be found on this object.
Ben N

Windows Server 2012에서 나를 위해 일했습니다 : (ls. \ backup_db_20150810.sql) .LastWriteTime = Get-Date
ThiagoAlves

0

위의 John T의 답변과 관련하여 :

나는 find'와 exe 로 'exec 명령을 끝내는 것과 ' \;+' 를 끝내는 것의 차이점을 이해하려고했습니다 (후자는 알지 못했습니다).

이것은 유용했다 : ( 여기에서 )

-exec command ;
명령을 실행하십시오. 0 상태가 반환되면 true입니다. 찾은 다음의 모든 인수는 ';'로 구성된 인수까지 명령에 대한 인수로 간주됩니다. 발생합니다. 문자열 '{}'은 (는) 일부 버전의 find에서와 같이 단독 인수가 아닌 명령 인수에서 발생하는 모든 위치에서 처리되는 현재 파일 이름으로 바뀝니다.

-exec command {} +
이 -exec 조치 변형은 선택된 파일에서 지정된 명령을 실행하지만 명령 행은 선택한 각 파일 이름을 끝에 추가하여 빌드됩니다. 명령의 총 호출 수는 일치하는 파일 수보다 훨씬 적습니다. 명령 행은 xargs가 명령 행을 빌드하는 것과 거의 같은 방식으로 빌드됩니다. 명령 내에서 하나의 '{}'인스턴스 만 허용됩니다. 명령은 시작 디렉토리에서 실행됩니다.

c:\myfolder2 개의 파일이 들어 있는 폴더 를 고려 a.txt하고b.txt

  1. find . -type f -exec touch {} +해석 :
    touch a.txt b.txt
    이것은 xargs의 작동 방식과 유사합니다

  2. 반면 다음 find . -type f -exec touch {} \;과 같이 해석됩니다.
    touch a.txt
    touch b.txt

따라서 # 1이 훨씬 빠릅니다 (그러나 다음 명령 exec은 하나의 {}자리 표시 자만 가질 수 있다는 제한이 있습니다 ).


좋은 정보가 담긴 훌륭한 의견이지만 질문에 대한 답변은 아닙니다. 이것이 댓글이라면 +1했을 것입니다.
TonyG

1
:) 나는이 포스트를 만드는 기억이 없다 :)
Ashutosh Jindal

0

현재 디렉토리 및 모든 하위 디렉토리에 PowerShell 사용 :

dir -R | foreach { $_.LastWriteTime = [System.DateTime]::Now }

또는 바로 다음에 폴더를 지정할 수 있습니다 dir.

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