touch文件和>文件有什么区别?

lmi*_*asf 22 command-line

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

$ > file.txt

$ touch file.txt
Run Code Online (Sandbox Code Playgroud)

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

Win*_*nix 28

双方touch>会创建一个新的文件,如果它不存在。如以下终端命令所示,当您touch访问现有文件时,访问/上次修改时间会更新。但是,如果您>访问现有文件,它会被截断并更新上次修改时间(访问时间不是)。请注意,>不会删除/取消链接文件。inode 保持不变——这就是为什么>/或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
Run Code Online (Sandbox Code Playgroud)

如评论中所述,touch是一个外部命令,仅对文件进行操作。>是一个 shell 内置功能,可用于许多不同的目的。通常你会看到它像cat source.fil > target.fil.

清空文件的长格式是:

cat /dev/null > emptyme.fil
Run Code Online (Sandbox Code Playgroud)

Using> emptme.fil以一种紧凑的格式完成了同样的事情,即不将任何内容重定向到文件。

  • 它实际上并没有重新创建。现有文件被截断,这与取消旧文件链接并创建新文件不同。最大的可观察差异是,如果一个进程仍然打开或映射了旧文件,它仍然存在。但是截断会影响其他进程打开的文件。 (8认同)

L. *_*mes 14

两者有本质区别。 Touch是用于给文件打时间戳的命令。该>符号是标准输出重定向器。

两者的用法说明

触摸的使用

如果该文件不存在,它将创建该文件。

触摸通常用于创建标志。例如,如果您想查找系统上两次之间的所有文件,您可以使用以下命令序列:

$ touch -t 201609292200 starttime 
$ touch -t 201609292300 endtime
Run Code Online (Sandbox Code Playgroud)

这将创建以下文件(或更改时间戳,如果它们存在):

-rw-rw-r-- 1 ljames ljames 0 Sep 29 23:00 endtime
-rw-rw-r-- 1 ljames ljames 0 Sep 29 22:00 starttime
Run Code Online (Sandbox Code Playgroud)

现在您可以使用 find 来显示或处理在那一小时(这两个文件时间戳之间的时间,即 2016 年 9 月 29 日晚上 10 点到晚上 11 点之间)修改过的所有文件。

$ touch -t 201609292200 starttime 
$ touch -t 201609292300 endtime
Run Code Online (Sandbox Code Playgroud)

这是上述 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
Run Code Online (Sandbox Code Playgroud)

输出重定向的使用

重定向符号会将标准输出重定向到指定的文件。如果可能失败,取决于您的 clobber/noclobber 设置。Noclobber 只会在文件不存在时创建它。

重定向输出有多种版本,其中包括:

> - 重定向标准输出。创建或覆盖现有文件。
>> - 重定向附加。创建或附加到现有文件。
>& - 重定向标准输出和标准错误。
>>& - 重定向/附加标准输出和标准错误

我们可以使用find上面的命令将指定小时内创建的所有文件的内容重定向到一个我们可以稍后记录和研究的文件:

-rw-rw-r-- 1 ljames ljames 0 Sep 29 23:00 endtime
-rw-rw-r-- 1 ljames ljames 0 Sep 29 22:00 starttime
Run Code Online (Sandbox Code Playgroud)


hee*_*ayl 9

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

需要注意的重要一点是,这个重定向操作符会在前面的命令运行之前由 shell 处理,所以这不依赖于任何命令,并且由 shell 本身处理。

请注意,某些 shell(例如zsh)在空重定向时的行为会有所不同,例如:

 >file.txt
Run Code Online (Sandbox Code Playgroud)

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

 : >file.txt
Run Code Online (Sandbox Code Playgroud)

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

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