【问题标题】:Write to a file whose path does not exist yet写入路径尚不存在的文件
【发布时间】:2014-07-29 15:37:41
【问题描述】:

我想在

中使用终端写入文件file.txt
/dir1/dir2/dir3/dir4...dirN/file.txt

路径/dir1/dir2/dir3/dir4...dirN/ 不存在。如何写入此文件以便动态创建路径?

【问题讨论】:

  • 更适合 superuser.stackexchange.com,他们会告诉你 mkdir -p

标签: bash terminal directory


【解决方案1】:

只需使用mkdir -p 即可:

mkdir -p /dir1/dir2/dir3/dir4...dirN/

-p 如果不存在,则创建整个目录结构。如 mkdir 手册页中所述:

根据需要创建中间目录。如果没有这个选项 指定,每个操作数的完整路径前缀必须已经存在。 另一方面,指定此选项后,不会出现错误 如果作为操作数给出的目录已经存在,则报告。 使用 rwxrwxrwx 权限位创建中间目录 (0777) 由当前 umask 修改,加上写入和搜索 所有者的权限。

这里全部用在一个小的shell脚本中;对于此示例,仅上升到 /dir1/dir2/dir3/dir4/

if [ ! -d /dir1/dir2/dir3/dir4/ ]; then
  mkdir -p /dir1/dir2/dir3/dir4/;
fi;
echo "Hello world" >> /dir1/dir2/dir3/dir4/file.txt

或者为了更灵活一点,您可以添加变量甚至使用dirname 来获取文件基本路径:

// Set the filename.
FILENAME="/dir1/dir2/dir3/dir4/file.txt"

// Get the directory basepath by using dirname.
DIRECTORY=$(dirname ${FILENAME})

// If the directory does not exist, create it.
if [ ! -d ${DIRECTORY} ]; then
  mkdir -p ${DIRECTORY};
fi

// Now do something like appending text a filename in that directory.
echo "Hello world" >>  ${FILENAME}

【讨论】:

  • @OlivierDulac 谢谢!已更正。
  • 我也应该能够写入该文件。
【解决方案2】:

单独创建目录然后创建文件:

mkdir -p "/dir1/dir2/dir3/dir4...dirN" && : >> /dir1/dir2/dir3/dir4...dirN/file.txt

注意:如果您只是想确保/dir1/dir2/dir3/dir4...dirN/file.txt 存在,您可以创建这样的函数:

function summon {
    mkdir -p "${1%/*}" && : >> "$1"
}

# Application:

FILE="/dir1/dir2/dir3/dir4.txt"

if summon "$FILE"; then
    # Do something with "$FILE"
    : ...
else
    echo "Failed to prepare file $FILE".
fi

【讨论】:

  • 为什么选择函数名称为“summon”?
猜你喜欢
  • 1970-01-01
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
  • 2014-08-11
  • 2020-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多