我是 Linux 的新手,我想知道是否>
有touch
相同的效果。我的意思是,以下两个命令是否有相同的效果?
$ > file.txt
$ touch file.txt
如果是这样,那么我只需输入“> file.txt”即可创建新文件,这真是太好了。
答案1
如果文件不存在,touch
和都会创建新文件。如以下终端命令所示,当您访问现有文件时,访问/上次修改时间会更新。但是,如果您访问现有文件,它将被截断,并且上次修改时间会更新(访问时间不会更新)。请注意,不会删除/取消链接文件。inode 保持不变 - 这就是为什么/ 或通常用于清除日志文件,即使有打开的文件句柄也是如此。>
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.txt > Target.txt
。
清空文件的详细格式如下:
cat /dev/null > EmptyMe.txt
使用> EmptyMe.txt
紧凑格式完成相同的操作,无需将任何内容重定向到文件。
答案2
两者之间有着本质的区别。 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/[email protected]_groups.xml
-rw-rw-r-- 09/29 22:08 08 /home/users/l/j/ljames/.thunderbird/lj7p62iq.default/gcontactsync/google_feed_backups/[email protected]
-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
输出重定向的使用
重定向符号将标准输出重定向到指定文件。根据您的 clobber/noclobber 设置,是否可能会失败。Noclobber 仅在文件不存在时才创建该文件。
重定向输出有多个版本,包括:
> - 重定向标准输出。创建或覆盖现有文件。 >> — 重定向附加。创建或附加到现有文件。 >&——重定向标准输出和标准错误。 >>&——重定向/附加标准输出和标准错误
我们可以使用find
上面的命令将指定小时内创建的所有文件的内容重定向到我们可以稍后记录和研究的文件中:
$ find ~/ -newer starttime ! -newer endtime -printf "%M %Tm/%Td %TH:%TM %TM %p\n" > ~/files.log
答案3
>
是 shell 输出重定向操作符,用于将前面命令的 STDOUT 重定向到 后面提到的文件描述符>
。如果文件存在,则其内容将被截断,就像使用标志对文件进行截断一样open(2)
,O_TRUNC
如果文件不存在,则将创建该文件。
需要注意的是,这个重定向运算符将在前面的命令运行之前由 shell 处理,因此这不依赖于任何命令,而由 shell 本身处理。
请注意,某些 shell(例如zsh
)对于空重定向的行为会有所不同,例如:
>file.txt
一个典型的解决方法是添加:
(true
)no-op 命令:
: >file.txt
传统上,的主要目的touch
是改变文件的时间戳,而不是创建文件。
touch
仅当参数中提到的文件不存在时才创建文件,否则它会将文件的修改时间更改为当前时间戳。您还可以使用 更改访问时间和 inode 创建时间touch
。