请注意:
我是不是询问如何从命令行创建文件!
我多年来一直使用touch
它来制作文件,但没有注意到它的主要用途是其他的。如果想从命令行创建文件,有多种可能性:
touch foo.bar
> foo.bar
cat > foo.bar
echo -n > foo.bar
printf '' > foo.bar
我确信还有更多。
但事实是,上面的命令实际上都不是为创建文件而设计的。例如,man touch
建议此命令用于更改文件时间戳。为什么像 Unix(或 Linux)这样完整的操作系统没有专门为创建文件而设计的命令?
答案1
我想说是因为几乎没有必要创建一个空文件,您不会立即在命令行或 shell 脚本中填充内容。
如果可以一步完成,那么先创建文件然后使用 I/O 重定向写入文件绝对没有任何好处。
在那些你确实想创建一个空文件并保留它的情况下,我认为这> "${file}"
再简单不过了。
长话短说:它不存在,因为创建空文件通常没有用处,并且如果有的话,已经有无数的选项可用于实现此目标。
顺便说一句,touch
仅当文件不存在时使用才有效,而使用重定向的选项将始终截断文件,即使文件存在(因此从技术上讲,这些解决方案并不相同)。> foo
是首选方法,因为它节省了 a,fork
并且echo -n
通常应该避免,因为它非常不可移植。
答案2
Adrian Frühwirth 的回答是正确的。我只是想补充一点,实际上有一个专门用来创建文件的命令:mktemp
。
NAME
mktemp - create a temporary file or directory
SYNOPSIS
mktemp [OPTION]... [TEMPLATE]
DESCRIPTION
Create a temporary file or directory, safely, and print its name. TEM‐
PLATE must contain at least 3 consecutive 'X's in last component. If
TEMPLATE is not specified, use tmp.XXXXXXXXXX, and --tmpdir is implied.
Files are created u+rw, and directories u+rwx, minus umask restric‐
tions.
当然,mktemp
的工作不是创建一个具有特定名称的文件,它只是创建一个文件。然而,正如您已经被告知的那样,有很多更有效和更优雅的方法来创建具有给定名称的文件,为此提供命令是毫无意义的。
也就是说,你也有truncate
和fallocate
两者的本质目的都是创建文件。他们只是有一种更复杂的方法。永远不会有一个简单的程序可以完成该> file
功能,因为它不可能比> file
.
答案3
大多数基本的 shell 工具都不是设计的为了任何非常具体的目的。最基本的 shell 工具是设计的只是为了达到你的目的而与他人互动。或者也许应该说,大多数工具只做一件非常基本的事情,无论如何组合它们来实现目标。
: >./file
这会创建一个空文件。或者根据需要截断现有文件。你可以:
set -o noclobber
为了避免后一种情况的任何可能性,除非您:
: >|./file
您可以获得与以下类似的行为touch
:
: >>./file
: >>|./file
但:
不会更新文件的修改时间,因为它没有被修改。
演示版
mkdir test ; cd $_
touch touch.file
: >null.file
echo >echo.file
ls -l
输出
-rw-r--r-- 1 mikeserv mikeserv 1 Apr 10 14:52 echo.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 null.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 touch.file
请勿触摸
: >>|./echo.file
ls -l
输出
-rw-r--r-- 1 mikeserv mikeserv 1 Apr 10 14:52 echo.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 null.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 touch.file
答案4
该实用程序install
实际上是为创建文件而设计的!您可以通过/dev/stdin
(在大多数情况下,但是,在大多数版本的 Linux 上,这需要安装)传递文件的内容/proc
或提供另一个源文件。您可以设置所有权和权限。
echo "New file" | install -o 0644 -m 452452 -g dumbass /dev/stdin /var/www/index.html
作为一个愚蠢的例子。