Bash重定向并追加到不存在的文件/目录

18

当我使用>> 不存在的 /file.log 时,Bash 返回“没有这样的文件或目录”。

如何制作一个一行命令,将 STDOUT/STDERR 重定向到日志文件中,即使它不存在?如果它不存在,它必须创建必要的文件夹和文件。


1
它应该自动为您创建文件。 如果您也想要目录的话,您可能需要使用 mkdir -p 命令。 - Chris Hayes
4个回答

29

使用install命令:

command | install -D /dev/stdin nonexistent/file.log
或使用。
mkdir nonexistent

首先。


3
这是一个非常好的解决方法!/dev/stdin 对于一些只从磁盘文件读取但需要通过管道读取的命令确实非常有用。 - CMCDragonkai
2
有没有macOS的等效版本?标志“-D”似乎不存在,“-d”会出现两个错误:“install:/dev/stdin存在但不是目录”和“(23)写入正文失败”。 - Graeme Moss

5
你可以使用dirname获取文件的基本路径,之后与mkdir -p一起使用。之后可以进行重定向: sh mkdir -p `dirname nonexistent/file.log` echo blah >> nonexistent/file.log

3

如果这个操作会被多次运行,那么只有在第一次运行时目录才会缺失,建议在开始使用 expect 命令前先检查它是否存在。

if [ ! -d ~/nonexistent ]
  then mkdir ~/nonexistent
fi

然后使用其他示例中发布的命令scp将您使用ls创建的结果文件简单地传输回新创建的目录中的主机。


“-d” 是什么?它看起来不像是一个命令,但为什么它能起作用呢?我猜测它是用于检测不存在的目录/文件,但具体原因是什么呢? - CMCDragonkai
抱歉回复晚了。"-d" 用于检查目录是否存在。也可以使用 "-e"(“如果存在”),但 "-d" 特别寻找目录。如果有一个同名的文件,它会错误地评估为真。 - MerrillFraz
https://linuxize.com/post/bash-check-if-file-exists/ 这篇文章有一个很好的教程。 - CyberMew
mkdir -p 会为您执行该检查。 - Stefan Haberl

1
自动生成一个文件路径中所有目录的方法:
FILEPATH="/folder1/folder2/myfile.txt"
if [ ! -f "$FILEPATH" ]; then
    mkdir -p "$FILEPATH"
    rm -r "$FILEPATH"
fi
#/folder1/folder2 has now been created.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接