触摸文件和>文件有什么区别?


17

我是那种新手到Linux的,我不知道是否>touch有同样的效果。我的意思是,以下两个命令是否具有相同的作用?:

$ > file.txt

$ touch file.txt

如果是这样,很高兴知道我可以键入`> file.txt'来创建新文件。


5
如果file.txt已经存在并且不为空,则它们肯定不存在。
fkraiem

1
@fkraiem,能否请您详细说明一下?
lmiguelvargasf

4
他是说,如果您touch的文件包含数据,则不会发生任何事情,但是如果您>将其删除,则不会发生任何事情。
WinEunuuchs2Unix

我知道了。非常感谢您的澄清@ WinEunuuchs2Unix
lmiguelvargasf

您想回答问题,让我回答问题,让@fkraiem回答还是删除它?
WinEunuuchs2Unix

Answers:


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是一个外部命令,仅对文件起作用。>是Shell内置功能,可用于许多不同目的。通常,您会看到它的用法像cat source.fil > target.fil

清空文件的长格式为:

cat /dev/null > emptyme.fil

使用> emptme.fil可以将任何内容都不重定向到文件的紧凑格式来完成相同的操作。


用例:> file.txt非常适合清除日志文件。
Rinzwind '16

8
实际上并没有重新创建它。现有文件被截断,这与取消链接旧文件并创建新文件不同。可以观察到的最大区别是,如果某个进程仍具有打开或映射的旧文件,则该文件仍将存在。但是截断会影响其他进程打开的文件。
彼得·科德斯

1
不确定“最大的可观察到的”-很容易观察到硬链接是否断开(如果ln foo bar先删除然后重新创建foo,则bar仍然具有其先前的内容)。
查尔斯·达菲,2016年

1
哦,是的,这是一个更容易观察到的差异。我应该想到的是:P
彼得·科德斯

@ Charles-Duffy当然,当我想知道一个国际剑联有2条明显的链接时,那与Peter Cordes所说的毫无关系。删除/取消链接当前正在使用的文件/已打开文件句柄时,不会删除该文件句柄。例如,假设您rm /var/log/nginx/access.log在nginx打开该文件时,它将具有0个链接,但inode仍然存在。 lsof -c nginx | grep access.log然后加上pid,ls -l /proc/<pid>/fd/ | grep access.log最后加上cat / proc / <pid> / fd / <前一个命令>`中的文件名。即使这很旧也要发表评论。希望它有意义
skrewler'Mar

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说'Resstate Monica''16

本节将对此进行说明Usage of Output redirection。通知说>>= Redirect append>
LD詹姆斯

是的,对于已经知道这一点的人来说,这非常清楚。把自己放在OP的鞋子上—您已经在墙上贴上了“ 太长而无法阅读”的文字;他不会从您的答案中了解到>> file.txt可以替代的方法touch file.txt。(您是唯一提到的人,>> 就是为什么我在您的答案而不是在问题下发表我的评论的原因。)
G-Man说'Reinstate

1
@ G-Man有些人将重定向符号混淆为触摸的替代品。但是,它不能替代。我的答案的详细信息是澄清此错误。使用两者的示例有助于阐明这一点。请注意第一行回答了您当前评论的初始细节。它说两者之间有显着差异。OP对差异感兴趣。因此,答案的其他部分是回应OP对两者的兴趣。有不同的效果,并且有差异的原因。
LD詹姆斯

9

> 是Shell输出重定向操作符,用于将前面命令的STDOUT重定向到后面提到的文件描述符 >。如果该文件存在,则其内容将被截断,如带有open(2)-ed和O_TRUNC标志的文件,如果该文件不存在,则将创建该文件。

需要注意的重要一点是,此重定向操作符将在前面的命令运行之前由Shell处理,因此它不依赖于任何命令,而是由Shell本身处理。

请注意,某些外壳程序(例如zsh)在使用空重定向时会有所不同,例如:

 >file.txt

一个典型的解决方法是添加:true)no-op命令:

 : >file.txt

传统上,的主要目的touch是更改文件的时间戳,而不是创建文件。

touch仅当参数中提到的文件不存在时才创建文件,否则它将文件的修改时间更改为当前时间戳。您还可以使用更改访问时间和索引节点创建时间touch


zsh确实支持空重定向-它的行为cat与不带参数的文件重定向非常相似。基本上,您键入的任何内容都会写入文件,直到出现EOF字符或中断为止。这zsh与just的行为<file类似,它只是打印文件内容,就像cat这样做一样。这些可能是可配置的,我已经看到<file在寻呼机中打开文件。
8bittree

@ 8bittree我的意思是你需要输入EOF(就像cat >file.txt你说的那样),bash只要这样做>file.txt就足够了。
heemayl

公平地说,我建议进行修改,以使想法更清晰。
8bittree '16

@ 8bittree已批准。
heemayl

(1)默认情况下,同时touch更新文件的修改时间和访问时间。有一些选项只能更新一个。(2)通常,Unix / Linux / POSIX不支持“ inode创建时间”。某些文件系统类型支持它,但是没有通用的查看方式,更不用说对其进行修改了。您是否可以提供一个引用,说明该版本touch可以使用户更改inode的创建时间?
斯科特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.