Shell与CMD创建空白文本文件的方法

11 次阅读

创建空白文本文件是 Shell 和 Windows CMD 中非常常见的基础操作。虽然两者都能通过命令行快速生成 .txt 文件,但具体命令、重定向方式以及文件已存在时的处理逻辑有所不同。掌握这些方法后,无论是编写脚本、初始化配置文件,还是批量创建文件,都可以避免频繁打开文本编辑器。

Shell 创建空白文本文件

Linux、macOS 以及其他 Unix-like 系统通常使用 Shell 作为命令行环境。创建空白文本文件最常见的方法是 touch。

使用 touch 创建空白文件

Bash
touch test.txt

执行后,当前目录会生成一个名为 test.txt 的文件。如果文件原本不存在,touch 会创建一个大小为 0 字节的普通文件。

可以通过以下命令检查:

Bash
ls -l test.txt

如果看到类似下面的结果:

-rw-r--r-- 1 user user 0 Sep 30 12:00 test.txt

其中的 0 表示文件当前没有任何内容。

touch 不仅可以创建文件。如果目标文件已经存在,它通常不会清空原有内容,而是更新文件的访问时间和修改时间。因此,如果目的是创建一个真正的空文件,不能简单地认为再次执行 touch 就会清空文件。

使用重定向创建空白文件

Shell 中还可以利用输出重定向:

Bash
> test.txt

这种写法非常简洁。如果文件不存在,会创建一个空文件;如果文件已经存在,则会将文件内容截断为 0 字节。

例如:

Bash
echo "hello" > test.txt

此时文件中有内容。如果随后执行:

Bash
> test.txt

原来的内容就会被清空。

因此,两种方式适用于不同场景:

Bash
touch test.txt

适合“不存在就创建,已有文件不要清空”的场景。

Bash
> test.txt

适合“确保文件为空”的场景。

使用 printf 创建空文件

还可以使用 printf:

Bash
printf "" > test.txt

它同样会创建一个空文件,如果文件已经存在,则会清空原有内容。

相比之下,printf 在脚本中更加灵活,因为后续如果需要向文件写入格式化内容,可以直接扩展命令。

例如:

Bash
printf "username=%s
" "admin" > config.txt

指定路径创建文本文件

创建文件时可以直接指定目录:

Bash
touch /tmp/test.txt

也可以使用相对路径:

Bash
touch ./config/test.txt

需要注意的是,目标目录必须已经存在,否则 touch 会报错。例如:

touch: cannot touch 'config/test.txt': No such file or directory

可以先创建目录:

Bash
mkdir -p config
touch config/test.txt

mkdir -p 会在目录不存在时创建目录,同时不会因为目录已经存在而报错。

Shell 批量创建空白文本文件

如果需要一次创建多个文本文件,可以直接将多个文件名传给 touch:

Bash
touch a.txt b.txt c.txt

执行后会同时得到:

a.txt
b.txt
c.txt

也可以配合 Shell 循环批量生成:

Bash
for i in {1..5}; do
    touch "file$i.txt"
done

最终会生成:

file1.txt
file2.txt
file3.txt
file4.txt
file5.txt

如果文件数量较多,这种方式非常适合自动化脚本。

CMD 创建空白文本文件

Windows CMD 没有 Linux 中完全对应的 touch 命令,但可以利用重定向操作符创建空白文件。

使用 type nul 创建空文件

最经典的 CMD 方法是:

cmd
type nul > test.txt

执行后会在当前目录生成一个 0 字节的 test.txt。

这里的 nul 是 Windows 中的特殊设备名称,可以理解为一个不产生实际文件内容的特殊输入源。

因此:

cmd
type nul > test.txt

实际上就是把空内容重定向到 test.txt。

如果文件已经存在,该命令会清空文件内容,因此使用时需要注意这一点。

使用 echo 创建空白文件

也可以使用:

cmd
echo.> test.txt

这种方法比较常见,但需要注意一个细节:它并不是真正意义上的 0 字节文件。echo. 通常会产生换行,因此创建出来的文件可能包含一个换行字符。

如果只是希望得到一个看起来为空的文本文件,这种方法基本可以满足需求;如果程序严格要求文件大小为 0 字节,则更推荐:

cmd
type nul > test.txt

使用重定向创建文件

CMD 中还可以直接使用:

cmd
> test.txt

在常见的 CMD 环境下,这种方式也可以创建空文件。

不过从可读性来看:

cmd
type nul > test.txt

表达意图更加明确,尤其适合写入批处理脚本。

CMD 批量创建空白文件

CMD 同样可以批量创建文件,例如:

cmd
type nul > file1.txt
type nul > file2.txt
type nul > file3.txt

如果需要生成大量具有规律名称的文件,可以结合 for 命令:

cmd
for %i in (1 2 3 4 5) do type nul > file%i.txt

执行后会创建:

file1.txt
file2.txt
file3.txt
file4.txt
file5.txt

如果这段命令写进 .bat 批处理文件,需要将 %i 写成 %%i:

cmd
for %%i in (1 2 3 4 5) do type nul > file%%i.txt

这是直接在 CMD 窗口执行和写入批处理脚本时容易混淆的地方。

Shell 与 CMD 创建空文件的区别

两种环境都可以通过重定向实现空白文件创建,但命令体系不同。

操作ShellCMD
创建文件touch test.txttype nul > test.txt
创建并清空> test.txttype nul > test.txt
写入文本echo "hello" > test.txtecho hello > test.txt
追加文本echo "hello" >> test.txtecho hello >> test.txt
批量创建touch a.txt b.txt多次使用 type nul 或 for

Shell 中的 touch 是专门处理文件时间戳和创建操作的工具,而 CMD 通常通过 type、echo 和重定向机制完成类似工作。

创建文件时需要注意的覆盖问题

命令行创建空文件时,一个很容易忽略的问题就是文件是否已经存在。

例如 Shell:

Bash
touch test.txt

不会因为文件已经存在而清空内容。

但:

Bash
> test.txt

会截断文件。

CMD 中:

cmd
type nul > test.txt

同样会覆盖已有文件内容。

因此,如果文件中已经保存了重要数据,执行带有 > 的命令之前应确认目标文件是否允许被覆盖。

如果 Shell 脚本需要避免覆盖已有文件,可以使用:

Bash
if [ ! -e test.txt ]; then
    touch test.txt
fi

这样只有目标文件不存在时才会创建。

也可以使用:

Bash
set -C
> test.txt
set +C

通过 Shell 的 noclobber 机制避免意外覆盖,不过具体行为会受到 Shell 类型和配置影响。

创建指定编码的文本文件

单纯创建空文件时,实际上不存在“文件编码”这一概念,因为文件中没有字符数据。

例如:

Bash
touch test.txt

得到的只是一个空文件。

只有当文件开始写入文本后,UTF-8、GBK、UTF-16 等编码才会产生实际意义。

如果程序要求配置文件必须采用 UTF-8 编码,可以在写入内容时明确指定编码。例如使用 Python、PowerShell 或其他工具生成文件,而不是单纯依赖 touch 或 type nul。

Shell 脚本中的实用写法

如果需要在 Shell 脚本中初始化日志文件,可以:

Bash
LOG_FILE="./logs/app.log"

mkdir -p "$(dirname "$LOG_FILE")"
touch "$LOG_FILE"

这种写法不会清空已有日志文件,因此适合程序启动时检查日志文件是否存在。

如果要求每次程序启动都重新生成一个空日志文件,则可以:

Bash
LOG_FILE="./logs/app.log"

mkdir -p "$(dirname "$LOG_FILE")"
: > "$LOG_FILE"

这里的 : 是 Shell 的空命令,配合重定向后可以实现清空或创建文件。

CMD 批处理中的实用写法

Windows 批处理脚本中,可以这样初始化一个文件:

cmd
set "FILE=test.txt"
type nul > "%FILE%"

如果文件路径包含空格,使用双引号尤其重要:

cmd
type nul > "C:Program Filesdemo	est.txt"

如果目录不存在,则需要先创建目录:

cmd
if not exist "C:	emp" mkdir "C:	emp"
type nul > "C:	emp	est.txt"

这样可以减少脚本执行过程中因为目录不存在而导致的错误。

常见问题

touch 命令在 CMD 中为什么不能使用?

touch 是 Unix/Linux 环境中常用的命令,并不是传统 Windows CMD 的内置命令。因此在 CMD 中直接执行:

cmd
touch test.txt

通常会出现:

'touch' is not recognized as an internal or external command

如果使用 Git Bash、WSL 等 Unix-like 环境,则可以正常使用 touch。

echo. > test.txt 和 type nul > test.txt 有什么区别?

两者都能生成一个表面上为空的文本文件,但 echo. 通常会写入换行符,因此文件未必是 0 字节。

如果明确要求创建 0 字节文件,在 CMD 中建议使用:

cmd
type nul > test.txt

touch 会清空文件吗?

不会。

如果:

Bash
echo "hello" > test.txt

随后执行:

Bash
touch test.txt

文件中的 hello 仍然存在。

如果需要清空文件,可以使用:

Bash
> test.txt

如何确认文件确实为空?

Linux/macOS Shell 可以使用:

Bash
wc -c test.txt

如果输出的字节数为 0,说明文件没有内容。

也可以:

Bash
ls -l test.txt

Windows CMD 可以使用:

cmd
dir test.txt

查看文件大小。如果大小显示为 0,则说明文件为空。

文件名中包含空格怎么办?

Shell 中建议使用引号:

Bash
touch "my test.txt"

CMD 中同样使用引号:

cmd
type nul > "my test.txt"

处理带空格的路径时,养成使用引号的习惯,可以避免大量路径解析问题。

实际选择哪种方法

如果主要使用 Linux 或 macOS,创建普通空白文件时优先考虑:

Bash
touch test.txt

它简单直观,也不会破坏已有文件内容。

如果需要明确把文件初始化为空,可以使用:

Bash
> test.txt

如果使用 Windows CMD,推荐:

cmd
type nul > test.txt

这种写法含义明确,并且能够得到真正的 0 字节文件。

如果是在 Windows 环境下进行开发,同时需要使用 Linux 命令,可以考虑 Git Bash 或 WSL。这样既可以使用 Windows 文件系统,又能获得更加完整的 Unix 命令行工具。

掌握 touch、type nul、echo 和重定向 >、>> 的区别后,Shell 与 CMD 中绝大多数基础文本文件创建需求都可以通过命令行快速完成。实际编写脚本时,还应重点关注文件覆盖、目录是否存在、路径中是否包含空格以及批处理变量转义等问题,这些细节往往比创建文件本身更加容易导致脚本执行异常。