`touch` 명령의 합법적 인 용도는 무엇입니까?


83

touch명령 의 요점은 무엇입니까 ? 빈 파일을 만들 수 있다는 것도 알고 있지만의 경우도 마찬가지입니다 echo -n.

그렇지 않으면 왜 누군가 파일의 타임 스탬프를 변경해야합니까? 파일의 나이에 대해 잘못된 인상을주지 않으면 다른 용도는 보이지 않으며 이것은 (내 관점에서) 합법적 인 것이 아닙니다.


15
대신 echo -n > filename다음을 실행할 수 있습니다.>filename
AMADANON Inc.

77
무엇 불법적 인 용도는?
bmargulies

10
Unless to create the false impression about the age of a file. 허위 인상이 필요하지 않습니다. 당신은 무엇을하면 원하는 수정 시간을 변경하려면? 스크립트에서 유용 할 수 있습니다. 이 스크립트touch명령 에 크게 의존 하며 그렇게하는 것이 매우 편리하고 간단합니다.
VL-80

7
tar아카이브를 추출 할 때 무엇을 수행하는지 고려하십시오 . 일반적으로 파일의 수정 시간을 아카이브가 추출 된 시간이 아니라 아카이브의 시간으로 설정하므로 이는 바람직한 기능입니다. 사용자 모드 프로그램이 잘못된 타임 스탬프를 만드는 것이 합법적이므로 touch명령 줄 인수를 기반으로 허용하지 않아야하는 이유 (또는 다른 명령 줄 프로그램)가 많지 않습니다. 배우는 C는 당신이 sh대본을 쓰는 사람보다 합법적이지 않습니다 ;-)
Steve Jessop

5
유닉스에서는 age파일 을 설명하는 타임 스탬프가 없습니다 . 그것은 creation타임 스탬프 가 될 것이며 유닉스 파일에는 타임 스탬프가 없습니다.
Kevin Fegan

답변:


98

장점 중 하나 touch는 임의의 타임 스탬프를 지정할 수 있지만 echo -n항상 현재 시간이 발생한다는 것입니다.

합법적 인 사용의 예는 소스 코드 파일의 타임 스탬프를 업데이트하여 프로그램 make이 소스 파일을 컴파일 된 객체보다 최신으로 간주하여 다시 작성하는 것입니다.

다른 용도는 존재 여부에 따라 단독으로 기능하는 파일을 작성하는 것입니다 (예 : /etc/nologin로그인이있는 경우 로그인을 허용하지 않음). 또한 형식이 짧을뿐 아니라 touch myfile보다 간단한 구성 이라고 주장합니다 echo -n >> myfile.


18
또 다른 일반적인 용도 : 특정 날짜까지 파일을 터치 한 다음 "find / -newer / the / file"을 터치하여 그 이후에 변경 / 생성 된 모든 파일을 찾습니다
Olivier Dulac

@ casey 문서를 확인했을 때 echo -n"후행 줄 바꿈을 출력하지 마십시오"라고 표시되어 있습니다. 그래서 어떻게 이것이 빈 파일을 만들 수 있는지 알 수 없습니다. 당신은 명확히 할 수 있습니까?
Geek

3
@Geek echo -n는 빈 문자열을 출력하고 그 자체로는 아무것도 수행하지 않습니다. 출력을 통해 리디렉션 >>하면 빈 출력이 파일에 추가됩니다. 파일이 존재하지 않으면 리디렉션으로 인해 파일이 작성됩니다.
케이시

6
그것은 작동하지 않습니다 : 출력을 위해 기존 파일을 열지 만 쓰지 않아도 mtime (내 시스템에서)을 변경하지 않습니다. echo -n그렇게하더라도 아무 것도하지 않는 명령 에는 필요하지 않으며 사용해서는 안됩니다 . echo -n일부 쉘에서 문자열 "-n"을 출력 할 수 있습니다. 아무것도하지 :않거나 true더 나은 옵션 인 명령이 실제로 필요한 >> myfile경우 파일이 존재하지 않는 경우 파일을 만드는 유효한 방법입니다. 이 모든 것은 물론 "터치"만 사용해야한다는 대답을 뒷받침합니다.
hvd

40

기본 시스템 호출 ( utime)은 tar새로 복사 된 (타르 팅되지 않은) 파일의 타임 스탬프를 설정할 수있는 것과 같은 다양한 유틸리티에 중요 합니다. 일부 백업 유틸리티는 복사 한 파일의 마지막 액세스 시간을 재설정하도록 옵션을 설정할 수도 있습니다.

합법적으로 사용하는 touch것은 특정 타임 스탬프를 가진 파일을 만드는 것입니다. 그런 다음 "참조"파일을 다음과 같은 명령으로 사용할 수 있습니다 find. 예를 들어 2013 년 11 월 1 일보다 최근에 수정 된 모든 파일을 찾으려면 (예 : 2013/11/01) "

touch -amt 201311010000 myref
find . -type f -newer myref -exec ls -ld {} +

201311010000 이것을 계산하는 방법은 2013 년 11 월 1 일 을 의미합니까? 이것을 알려주는 유틸리티가 있습니까? 다시 말해 터치 할 입력을 어떻게 결정합니까?
Geek

4
수를보고 첫 번째 부분 것을주의하여 @Geek, 20131101,로 나눌 수 있습니다 2013-11-01, 또는 것을 2013 년 11 월 1 일 당신은 추측 할 수 0000부분이 경우, 00시간 00 분 하루 중 특정 시간을 나타냅니다. 또는의 맨 페이지를 보면 touch형식이 무엇인지 정확하게 알려줍니다 (참조 -t).
JAB

@Geek 맨 페이지는 당신의 친구입니다 :-)
JRFerguson

39

touch명령의 주요 목적은 파일의 타임 스탬프를 조작하고 파일을 작성하는 것입니다.

1. 파일 만들기

$ ls -l
total 0

$ touch file{1..3}

$ ls -l
total 0
-rw-rw-r--. 1 saml saml 0 Jan 12 13:33 file1
-rw-rw-r--. 1 saml saml 0 Jan 12 13:33 file2
-rw-rw-r--. 1 saml saml 0 Jan 12 13:33 file3

참고 :total 0 에서 출력이 ls -l올바른 것입니다. 이 구현은 ls파일이 나열 될 때 파일이 사용하는 블록 수 를 보여줍니다. 에 -s스위치를 추가하여이 사실을 확신 할 수 있습니다 ls. 각 파일에서 사용중인 블록이 나열됩니다. 여기에 file1 & file2에 2자를 추가했습니다.

$ ls -ls
total 8
4 -rw-rw-r--. 1 saml saml 3 Jan 13 12:07 file1
4 -rw-rw-r--. 1 saml saml 3 Jan 13 12:09 file2
0 -rw-rw-r--. 1 saml saml 0 Jan 13 12:05 file3

2. 파일의 시간 / 날짜 정보-stat 명령

$ stat file1
  File: ‘file1’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd02h/64770d    Inode: 11403667    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/    saml)   Gid: ( 1000/    saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2014-01-12 13:33:38.279456149 -0500
Modify: 2014-01-12 13:33:38.279456149 -0500
Change: 2014-01-12 13:33:38.279456149 -0500
 Birth: -

touch주어진 파일에서 다양한 타임 스탬프를 조작하는 데 사용할 수 있습니다 .

3. 터치 맨 페이지에서 발췌

   -a     change only the access time
   -m     change only the modification time
   -t STAMP
          use [[CC]YY]MMDDhhmm[.ss] instead of current time

4. 액세스 시간 조작

$ touch -a -t200001010000 file1

$ stat file1
  File: ‘file1’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd02h/64770d    Inode: 11403667    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/    saml)   Gid: ( 1000/    saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2000-01-01 00:00:00.000000000 -0500
Modify: 2014-01-12 13:33:38.279456149 -0500
Change: 2014-01-12 13:38:52.023434696 -0500
 Birth: -

5. 수정 시간 조작

$ touch -m -t200001010000 file1

$ stat file1
  File: ‘file1’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd02h/64770d    Inode: 11403667    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/    saml)   Gid: ( 1000/    saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2000-01-01 00:00:00.000000000 -0500
Modify: 2000-01-01 00:00:00.000000000 -0500
Change: 2014-01-12 13:39:31.060432026 -0500
 Birth: -

변경 시간 (ctime)이 궁금 할 수 있습니다. 을 사용하여 조작 할 수 없습니다 touch. 메타 데이터가 파일을 건드린 시간을 추적합니다. "변경"타임 스탬프를 트리거하지 않고 파일에 대해 무엇을 할 수 있습니까? 라는 제목의 자세한 내용은이 U & L Q & A를 참조하십시오 . .


@sim : 내 질문은 터치가 타임 스탬프를 변경하는 것임을 알고 있음을 의미합니다. 나는 정직한 사용자가 왜 그것을 원하는지 알고 싶었습니다. 귀하의 답변의 ctime 부분이 아닌 경우 -1을주었습니다.
Quora Feans

16
@QuoraFea-제 답변은 앞으로 혜택을 누리게 될 귀하의 이익을위한 것입니다. 대답이 순전히 당신을위한 것이라고 가정하지 말고 어떤 식 으로든 당신을 화나게해서 미안합니다. 그것은 나의 의도가 아니 었습니다. 나는 단지 시간이 어떻게 작용하는지에 대한 기초를 설명하려고 시도했을뿐입니다.
slm

@sim : 기분 나쁘지 않습니다. 정답이 올바른 방향으로 가고 있지 않다고 생각했습니다. 어쨌든,이 답변에 감사드립니다.
Quora Feans

@QuoraFea-천만에요. Q. 감사합니다. 감사합니다!
slm

1
@Geek-명령을 시도하십시오. ls -l파일 크기가 0 인 디렉토리에서 올바로 출력되었으며 아직 아무것도 없습니다. 파일 크기 중 하나를 지정하면 파일에서 사용중인 블록의 양과 함께 총계가 표시됩니다. 확실하지 않은 경우 내 업데이트를 참조하십시오. 예를 추가했습니다.
slm

20

당신이 얻은 다른 두 가지 좋은 대답 외에도, 또 다른 용도는

파일의 나이에 대한 잘못된 인상을 주다

예를 들어 백업 구성표 에 사용 합니다 . 백업이 동일하거나 백업이 원격 호스트에 느린 회선으로 업데이트되는 비용에 비해 변경 사항이 관련이 없기 때문에 최신 백업으로 백업을 업데이트하지 않을 수 있습니다. 이를 위해, 당신은, 새로운 타임 스탬프와 백업 파일을 표시하지 않는 단순 옵션이 날조 하지만 선언 해당 파일의 유효성 타임 스탬프는 지금 다른 하나라고합니다.

파일의 나이에 대한 인상은 이제 거짓이지만 그 의미 는 실제적이고 합법적입니다.


20

가장 일반적인 용도 중 하나는 touch코드 재 구축을 트리거하는 것입니다.

일반적인 빌드 도구 make와 그 파생물은 파일을 생성 한 파일 중 하나가 변경되지 않은 경우 (예 : .o 파일이 .c보다 최신 파일 인 경우) 파일을 다시 컴파일 / 재 빌드하지 않고 작업을 저장하려고합니다. 소스 파일을 생성하기 위해 컴파일 된 이후 C 소스가 변경되지 않았다고 가정하는 것이 일반적으로 안전합니다.

그러나 무언가를 재건하기를 원할 때가 있습니다. 소스 파일 중 하나를 불필요하게 수정할 수 있지만 실수로 무언가를 손상시킬 위험이 있습니다. 대신, touch파일을 변경하여 내용을 변경할 위험없이 새 것처럼 보이게 할 수 있으며 make파일에 의존하는 모든 것을 다시 빌드 할 시간 임을 확신하기에 충분 합니다.

다른 용도가 있지만 역사적으로 큰 것이 었습니다.


재구성을 위해 파일을 변경하는 것이 좋습니다. 일부 소스 코드 개정 시스템은 변경된 파일에 대해 혼동 될 수 있습니다. 그래서 touch수동으로 변경 한 나쁘다. 재 구축을하려면 .o해당 소스 의 출력 파일 을 삭제하는 것이 좋습니다 .
harper

1
.o 파일을 수동으로 변경하고 제거하려면 시간과 입력이 더 필요하고 수동 변경은 오류가 발생하기 쉽습니다. 우리는 작업 사본에서 타임 스탬프를 수정하는 것에 대해서만 이야기하고 있습니다. 나중에 편집하면 파일에 변경 타임 스탬프가 올바르게 반영됩니다. 모든 버전 관리 시스템이 타임 스탬프에 의해 혼동되는 것은 아닙니다.
David

1
다윗이 말한대로. 이것은 실제로 오래 전의 표준 유닉스 관행이었으며 여전히 IDE 외부에서 작업하는 개발자에게는 표준 관행으로 남아 있습니다.
keshlam

12

개발 모드에서 소스 코드 파일의 변경 사항을보고 그 일이 발생했을 때 응용 프로그램을 다시로드하는 적어도 하나의 웹 프레임 워크 (어떤 것을 기억할 수 없는지)로 작업했습니다.

물론 때로는보고 있지 않은 것을 변경 한 후 다시로드하기를 원했습니다.이 경우 touch기본 구성 파일을 사용하여 트릭을 수행했습니다.

따라서 일반적으로 실제로 파일을 변경하지 않고 파일 변경으로 트리거 된 프로세스를 시작하려고 할 때마다.


4
이것은 실제로 mod_wsgi와 apache의 경우입니다. wsgi 파일을 터치하여 장고 웹 앱을 다시로드 할 수 있습니다.
sapi

11

합법적 인 터치 사용 :

  • 이미지 파일 (GIF / JPG / etc)의 타임 스탬프를 촬영 한 시간으로 업데이트합니다. 모든 렌더러가 EXIF ​​정보를 읽거나주의하지는 않습니다.
  • 파일 번들에 타임 스탬프가 중요한 파일 세트를 대량 업데이트 할 때는 c / m- 시간을 유지하십시오.
  • 실패 후 다른 가져 오기를 수행해야하는 경우 배치 (예 : CSV) 파일의 시간을 설정하고 가져 오기 프로그램은 타임 스탬프에 따라 다릅니다 (토론을 다른 주제 :-)
  • 보관 목적, 즉 연도를 기준으로 폴더에 백업 한 다음 간편한 정렬을 위해이 폴더의 시간을 1 월 1 일 YYYY로 설정

7

잘못 사용 된 파일의 타임 스탬프를 수정하는 것입니다.

예를 들어, 파일을 복사하는 모든 방법 (및 파일을 이동할 수있는 일부 방법)은 새 파일에 원본 파일의 타임 스탬프가 아닌 현재 시간의 타임 스탬프가 생깁니다.

일반적으로 이것은 원하는 것이 아닙니다. 터치는 "수정"할 수 있습니다.

또 다른 용도는 파일 타임 스탬프를 "edit ... undo-edit"작업 이전으로 복원하여 실행 취소 된 파일 수정을 반영하는 것입니다.


2
과연. 내가 찾은 여물통 시간 alias cp='cp --preserve=timestamps'은 PC 토지에서 나에게 더 적합합니다…
Runium

5

(또는 다른 사람들이 언급 한 것처럼 더 나은) things과 의 중요한 차이점 은 터치가 내용을 분쇄하지 않는다는 것입니다. 파일을 비 웁니다. 하지 않을 것이다. 콘텐츠 손상을 피하기위한 트릭을 생각하는 대신 터치 만 사용하십시오! 실제로 열기를 준비한 다음 닫기를 수행하는 데 시간을 낭비하지 않고 파일의 속성으로 만 작동하므로 커널에서 작업이 줄어 듭니다.echo> file> filetouch

파일이 현재 필수 또는 권고 잠금 상태이거나 독점적으로 열린 경우에도 터치하면 시간 소인이 변경 될 수 있습니다. 흠, 그것을 테스트하거나 그것에 대해 읽지 않았습니다 ...


2
>>덮어 쓰기 대신 추가
Michael Mrozek

나는 그것을 언급하는 것을 고려했지만 부작용의 영역으로 점점 더 커지고 있습니다. 또한 파일이 이미 독점적으로 열려있는 등의 경우 오류가 발생한다는 사실도 언급해야합니다.>를 사용하여 적용 할 수있는 문제. 필자는 파일의 통계를 만지는 것이 조금 빠르다는 기본 포인트를 넘어 보조 포인트가 덤불 주위를 두드리는 대신 똑바로 알려주는 코드를 작성하는 것이 좋습니다.

4

TV 프로그램을 녹화하기 위해 SageTV라는 소프트웨어 프로그램을 사용합니다. 이들은 매우 효율적인 코덱이 아닌 MPEG-2로 기록되며 iPad / iPhone에도 적합하지 않습니다. 그래서 파일을 .mp4 파일로 변환합니다. 그러나 파일을 재생할 때 SageTV는 파일의 타임 스탬프가 TV 쇼가 시작된 시점 일 것으로 예상합니다. 그렇지 않으면 쇼의 타임 라인을 망쳐 서 FF 또는 REW하기가 쉽지 않습니다. 따라서 터치를 사용하여 .mp4 파일의 타임 스탬프를 orignal 파일과 동일하게 재설정합니다.
합법적입니까?


2

종종 root-> 다른 것과 같이 userid에서 변경되는 프로세스가있을 수 있습니다. Touch를 사용하면 응용 프로그램이 다른 사용자로 로그인하기 전에 루트 만 만질 수있는 위치에 파일을 만들 수 있습니다.


그것은 "에코"로는 달성 할 수없는 터치를 사용하는 것이 아닙니다. 저자의 원래 질문을보십시오
Domingo Ignacio Galdos

에코는 개울 등을 포함합니다. inode를 직접 사용하여 터치를 최적화 할 수 있습니다. 성능 FTW!
user56560

2

직장에서 우리는 15 년 이상 거슬러 올라간 디지털지도 보관소를 가지고 있습니다. 이 오래된 맵은 대부분의 프로그램에서 이해하지 못하는 PostScript, EMF, PRN, hpgl2, pdf 등과 같은 다양한 형식으로 저장됩니다. 또는 12 가지 프로그램이 모두 필요합니다.

이러한 다양한 형식을 쉽게 검색하고 탐색 할 수 있도록 jpeg 버전의 맵을 만든 다음 touch를 사용하여 jpeg 파일을 원본이 생성 된 후 수년이 지난 원본 소스 파일 타임 스탬프와 일치시킵니다.

이제 Picasa와 같은 단일 프로그램을 사용하여 전체 라이브러리를보고 특정 날짜 범위를 간단하게 찾을 수 있습니다. 터치하지 않으면 모든 단일 이미지에 대해 날짜 메타 데이터를 수동으로 추가 한 다음 특정 날짜 범위를 찾을 때 해당 문자열을 검색해야합니다.


1

이 목적으로 아직 사용하지는 않았지만 디렉토리에서 파일과 날짜를 읽고 웹 페이지에서 사용하기 위해 읽는 스크립트가 있습니다. 편집해야 할 경우 날짜가 변경됩니다. touch주문을 다시 설정하는 것을 고려 했습니다.


1

일부 init 스크립트는 구성 파일의 타임 스탬프와 자체 pid 파일을 비교합니다. 결과는 실행중인 서비스를 다시로드할지 여부를 결정합니다.

구성을 변경하지 않고 강제로 다시로드하려는 상황이있는 경우 touch가 도움이됩니다.


0

마지막 작업 실행과 현재 실행 사이에 발생한 데이터베이스에서 변경 사항을 가져 오는 cron 작업이 있습니다. 변경 사항의 XML 파일을 생성 한 다음 다른 데이터베이스로 처리합니다. XML 출력 파일의 타임 스탬프에서 마지막 런타임을 얻습니다. *

XML 파일을 처리 할 때 문제가 발생하면 새 XML 파일의 타임 스탬프에 언급 된 날짜가 아닌 원래 날짜부터 실행을 반복 할 수 있습니다.

이렇게하는 스크립트를 편집하는 대신이 작업을 수행하는 가장 간단한 방법은 XML 파일을 터치하고 타임 스탬프를 필요한 날짜로 설정하는 것입니다.

또한 이전 XML 출력 파일없이 새로 시작하면 터치를 사용하여 단순히 존재를 시뮬레이션 할 수 있습니다.

[*] 누군가 지적하기 전에-작업이 시작되는 시간을 알고 XML 파일을 작성하면 DB 변경이 발생할 수있는 몇 분의 시간 간격이 남습니다. 작업은 DB 변경이 거의 없을 때 실행됩니다. 그건 내 변명이고 나는 그것을 고집하고있다 :-)

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