터치 파일과> 파일의 차이점은 무엇입니까?


17

나는 리눅스를 처음 접하는 사람 >이며 touch같은 효과가 있는지 궁금합니다 . 다음 두 명령이 같은 효과를 줍니까?

$ > file.txt

$ touch file.txt

그렇다면`> file.txt '를 입력하여 새 파일을 만들 수 있다는 것을 아는 것이 좋습니다.


5
경우 file.txt이미 존재하고 비어 있지, 그들은 분명하지 않습니다.
fkraiem

1
@fkraiem, 정교하게 대답 해 주시겠습니까?
lmiguelvargasf

4
그는 touch데이터가 들어있는 파일은 아무 일도 일어나지 않지만 >파일을 지우면 사라질 것이라고 말합니다.
WinEunuuchs2Unix

알았어 WinEunuuchs2Unix @ 그 설명에 대해 정말 감사합니다
lmiguelvargasf

질문에 대답하거나, 질문에 대답하거나, @fkraiem이 대답하거나 삭제하도록 하시겠습니까?
WinEunuuchs2Unix

답변:


24

모두 touch>존재하지 않는 경우 새 파일을 만듭니다. 다음 터미널 명령 touch에서 기존 파일을 볼 때 액세스 / 최종 수정 시간이 업데이트됩니다. 그러나 >기존 파일로 이동하면 파일이 잘리고 마지막 수정 시간이 업데이트됩니다 (액세스 시간은 아님). 참고 >삭제되지 않습니다는 / 파일을 해제. 아이 노드는 동일하게 유지 - 이유입니다 >/ 또는 truncate일반적으로도 열린 파일 핸들과 로그 파일을 삭제하는 데 사용됩니다.

rick@dell:~$ > EmptyFile

rick@dell:~$ touch EmptyFile2

rick@dell:~$ ls Empty*
EmptyFile  EmptyFile2

rick@dell:~$ ls -l Empty*
-rw-rw-r-- 1 rick rick 0 Sep 29 20:27 EmptyFile
-rw-rw-r-- 1 rick rick 0 Sep 29 20:27 EmptyFile2

rick@dell:~$ echo Hello > EmptyFile

rick@dell:~$ ls -l Empty*
-rw-rw-r-- 1 rick rick 6 Sep 29 20:28 EmptyFile
-rw-rw-r-- 1 rick rick 0 Sep 29 20:27 EmptyFile2

rick@dell:~$ > EmptyFile

rick@dell:~$ ls -l Empty*
-rw-rw-r-- 1 rick rick 0 Sep 29 20:28 EmptyFile
-rw-rw-r-- 1 rick rick 0 Sep 29 20:27 EmptyFile2

rick@dell:~$ echo Hello > EmptyFile

rick@dell:~$ touch EmptyFile

rick@dell:~$ ls -l Empty*
-rw-rw-r-- 1 rick rick 6 Sep 29 20:32 EmptyFile
-rw-rw-r-- 1 rick rick 0 Sep 29 20:27 EmptyFile2

주석에서 언급했듯이 touch외부 명령이며 파일에서만 작동합니다. >다양한 목적으로 사용되는 쉘 내장 기능입니다. 일반적으로 다음과 같이 사용되는 것을 볼 수 cat source.fil > target.fil있습니다.

파일을 비우는 긴 형식은 다음과 같습니다.

cat /dev/null > emptyme.fil

사용 > emptme.fil하면 파일로 아무것도 리디렉션하지 않는 간단한 형식으로 동일한 작업을 수행 할 수 있습니다.


사용 사례 : > file.txt로그 파일을 지우는 데 좋습니다.
Rinzwind

8
실제로 다시 생성되지는 않습니다. 기존 파일이 잘려서 이전 파일을 연결 해제하고 새 파일을 작성하는 것과 다릅니다. 관찰 할 수있는 가장 큰 차이점은 프로세스에 여전히 기존 파일이 열려 있거나 매핑 된 경우 여전히 존재한다는 것입니다. 그러나 절단은 다른 프로세스가 연 파일에 영향을줍니다.
Peter Cordes

1
"가장 큰 관찰 가능"에 대해 확실하지 않음-하드 링크가 끊어 졌는지 쉽게 확인할 수 있습니다 ( ln foo bar삭제 한 후 다시 작성해 foobar여전히 이전 내용이 있음).
Charles Duffy

1
네, 그것은 훨씬 더 쉽게 관찰 할 수있는 차이입니다. 나는 그것을 생각 했어야했다 : P
Peter Cordes

@ Charles-Duffy Sure, 필자가 추측 할 수있는 fie에 2 개의 링크가있을 때 Peter Cordes가 말한 것과는 아무런 관련이 없습니다. 현재 사용 중이거나 열린 파일 핸들이있는 파일을 삭제 / 링크 해제 할 때 삭제되지 않습니다. 예를 들어, rm /var/log/nginx/access.lognginx가 파일을 연 상태에서 링크는 0이지만 inode는 여전히 존재한다고 가정하십시오. lsof -c nginx | grep access.log그런 다음 pid를 사용하여 ls -l /proc/<pid>/fd/ | grep access.logcat / proc / <pid> / fd / <이전 명령의 파일 이름>`으로 이동하십시오. 이것이 오래되었지만 주석 달기. 그것이 의미가 있기를 바랍니다
skrewler

14

둘 사이에는 상당한 차이가 있습니다. Touch파일의 타임 스탬프에 사용되는 명령입니다. 이 >기호는 표준 출력 리디렉터입니다.

둘의 사용법 설명

터치 사용법

파일이 존재하지 않으면 파일이 생성됩니다.

터치 는 일반적으로 플래그를 만드는 데 사용됩니다. 예를 들어 시스템에서 두 번 사이의 모든 파일을 찾으려면 다음과 같은 명령을 사용할 수 있습니다.

$ touch -t 201609292200 starttime 
$ touch -t 201609292300 endtime

그러면 다음 파일이 생성됩니다 (또는 타임 스탬프가있는 경우 변경).

-rw-rw-r-- 1 ljames ljames 0 Sep 29 23:00 endtime
-rw-rw-r-- 1 ljames ljames 0 Sep 29 22:00 starttime

이제 find를 사용하여 해당 시간에 수정 된 모든 파일 (두 파일 타임 스탬프 사이의 시간, 즉 2016 년 9 월 29 일 오후 10시에서 11시 사이)을 표시하거나 처리 할 수 ​​있습니다.

$ find ~/ -newer starttime ! -newer endtime -printf "%M %Tm/%Td %TH:%TM %TM %p\n"

위의 find 명령의 일부 출력입니다.

-rw-rw-r-- 09/29 22:08 08 /home/users/l/j/ljames/.thunderbird/lj7p62iq.default/gcontactsync/google_feed_backups/apollothethird@gmail.com_groups.xml
-rw-rw-r-- 09/29 22:08 08 /home/users/l/j/ljames/.thunderbird/lj7p62iq.default/gcontactsync/google_feed_backups/apollothethird@gmail.com.xml
-rw-rw-r-- 09/29 22:08 08 /home/users/l/j/ljames/.thunderbird/lj7p62iq.default/gcontactsync/address_book_backups/abook.mab.bak
-rw-rw-r-- 09/29 23:00 00 /home/users/l/j/ljames/endtime
drwx------ 09/29 22:44 44 /home/users/l/j/ljames/.config/google-chrome/Default/Extensions/Temp
drwx------ 09/29 22:44 44 /home/users/l/j/ljames/.config/google-chrome/Default/Extensions/fahmaaghhglfmonjliepjlchgpgfmobi
drwx------ 09/29 22:44 44 /home/users/l/j/ljames/.config/google-chrome/Default/Extensions/fahmaaghhglfmonjliepjlchgpgfmobi/1.337.0_0

출력 리디렉션 사용

경로 재 지정 기호 는 표준 출력을 지정된 파일로 경로 재 지정합니다. 실패 할 수있는 경우 클로버 / 클로버 설정에 따라 Noclobber는 파일이 존재하지 않는 경우에만 파일을 생성합니다.

다음과 같은 여러 버전의 리디렉션 출력이 있습니다.

>-표준 출력을 재 지정하십시오. 기존 파일을 작성하거나 덮어 씁니다.
>>-리디렉션 추가 기존 파일을 작성하거나 추가하십시오.
> &-표준 출력 및 표준 오류를 모두 리디렉션합니다.
>> &-표준 출력 및 표준 오류 모두 리디렉션 / 추가

find위 의 명령을 사용 하여 지정된 시간 내에 생성 된 모든 파일의 내용을 나중에 기록하고 나중에 연구 할 수있는 파일로 리디렉션 할 수 있습니다.

$ find ~/ -newer starttime ! -newer endtime -printf "%M %Tm/%Td %TH:%TM %TM %p\n" > ~/files.log

많은 사람들이 file.txt존재하고 비어 있지 않으면 > file.txt내용을 지우지 만하지 touch file.txt않을 것이라고 언급했습니다. 그러나 아무도 언급하지 않았다 >> file.txt위한 좋은 대용품이다 touch file.txt- 그것은 (당신이 할 수있는 권한을 가지고 있다면 가정)이 존재하지 않는 경우 파일을 만들 것이다, 그러나 기존 파일을 절단하지 않습니다. ">"와 ">>"의 차이점
G-Man, 'Reinstate

이에 대해서는 섹션에서 설명합니다 Usage of Output redirection. 통지는 >>= 라고 말합니다 Redirect append>.
LD 제임스

그렇습니다. 이미 알고있는 사람들에게는 완벽합니다. 당신은 OP의 신발에 자신을 넣어-당신은 너무 오래 읽기 텍스트의 벽을 게시했습니다 ; 그는 귀하의 답변에서 >> file.txt에 대한 대안 으로 이해하지 못할 것 입니다 touch file.txt. (당신이 언급 한 유일한 사람이야 사실 >> 전혀은 차라리 질문에서보다, 당신의 대답에서 내 댓글을 게시하는 이유입니다.)
G-남자 '분석 재개 모니카'말한다

1
@ G-Man 일부 사람들은 리디렉션 기호를 터치 대신 사용하도록 혼동합니다. 그러나 그것은 대체물이 아닙니다. 내 대답의 세부 사항은이 실수를 분명히하는 것입니다. 이 두 가지를 사용하는 예는이를 명확히하는 것입니다. 첫 번째 몇 줄은 현재 의견의 초기 세부 사항에 답변합니다. 그것은 둘 사이에 중요한 차이가 있다고 말합니다. OP는 차이에 관심이 있습니다. 답의 다른 부분은 OP에 대한 OP의 관심에 응답하는 것입니다. 다른 효과가 있으며 차이의 이유가 있습니다.
LD 제임스

9

>셸 출력 리디렉션 연산자로, 이전 명령의 STDOUT을 이후에 언급 된 파일 설명 자로 리디렉션하는 데 사용됩니다 >. 파일이 있으면 플래그 open(2)와 함께 -ed가 있는 파일로 내용이 잘리고 O_TRUNC파일이 없으면 파일이 작성됩니다.

이 리디렉션 연산자는 이전 명령이 실행되기 전에 셸에서 처리되므로 명령에 종속되지 않으며 셸 자체에서 처리됩니다.

일부 쉘 (예 zsh:)은 다음과 같이 빈 리디렉션으로 다르게 작동합니다.

 >file.txt

일반적인 해결 방법은 :( true) no-op 명령 을 추가하는 것입니다 .

 : >file.txt

전통적으로, 주요 목적은 touch파일을 만들지 않고 파일의 타임 스탬프를 변경하는 것입니다.

touch인수에 언급 된 파일이 존재하지 않는 경우에만 파일을 작성하고, 그렇지 않으면 파일의 수정 시간을 현재 시간 소인으로 변경합니다. 를 사용하여 액세스 시간 및 inode 생성 시간을 변경할 수도 있습니다 touch.


zsh빈 리디렉션을 지원합니다- cat파일에 대한 인수가없는 리디렉션 과 매우 유사하게 작동 합니다. 기본적으로 입력 한 내용은 EOF 문자 나 인터럽트까지 파일에 기록됩니다. 이것은 zsh그냥 <file파일 내용을 인쇄하는 것처럼 그냥로 동작을 반영 합니다 cat. 이것들은 구성 가능할 수 있습니다 <file. 파일러에서 파일을 여는 것을 보았습니다 .
8bittree

@ 8bittree 내가 뭘 의미하는 것은 당신이 입력 할 필요가있다 EOF(일을 같이 cat >file.txt당신이 말한 것처럼), 어디에서 bash바로 일을 >file.txt충분합니다.
heemayl

공평하게, 나는 생각을 더 명확하게 이해한다고 생각되는 편집을 제안했다.
8bittree

@ 8bittree 승인 됨.
heemayl

(1) 기본적으로 touch파일의 수정 시간과 액세스 시간을 모두 업데이트합니다. 하나만 업데이트하는 옵션이 있습니다. (2) Unix / Linux / POSIX는 일반적으로 "inode creation time"을 지원하지 않습니다. 일부 파일 시스템 유형은이를 지원하지만 파일을 수정하는 것 외에는 보편적 인 방법이 없습니다. touch사용자가 inode 생성 시간을 변경할 수 있는 화신이 있다고 언급하는 참조를 제공 할 수 있습니까 ?
스콧
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.