Contents

在一个命令中创建Linux文件夹路径和文件

1. 概述

作为系统管理员,我们经常需要为管理它的应用程序创建带有空文件的嵌套目录。通常,当我们将文件复制到不存在的目标位置时,我们会收到“无文件或目录”错误。

显然,在终端中创建多个嵌套目录是一项繁琐且耗时的任务,需要以简单的方式创建目标目录和文件。

本教程将阐述在 Linux 系统中通过单个命令创建目录路径和文件的不同方法。现在,让我们深入了解它的本质。

2. 使用mkdirtouch命令

结合使用mkdir和*touch 命令,我们可以一次性完成创建目录和文件的任务。在这里,mkdir的 parent 选项帮助我们创建父目录(除非它存在)没有任何错误,而touch*命令创建一个文件。通常,touch命令不会将任何内容放入文件中。

让我们深入研究一个示例以更好地理解。

2.1. CLI 模式执行

首先,我们在 bash 变量FILE中获取整个路径结构和文件名。让我们使用echo命令查看FILE中的内容,方法是在其前面加上*$*符号:

$ FILE=./dir1/dir2/dir3/sample.txt
$ echo $FILE
./dir1/dir2/dir3/sample.txt

其次,dirname通过删除文件名帮助我们获得完整的目录结构。结果,它打印出必须由mkdir创建的整个目录结构:

$ dirname $FILE
./dir1/dir2/dir3

第三,让我们使用*-p*选项创建目录以创建嵌套目录。最后,touch命令在新路径中创建空文件。我们使用双 & 号来拉伸这两个命令。

双 & 号优于分号,因为后者同时执行两个命令,而前者仅在成功执行第一个命令后执行第二个命令**。

以下是mkdirtouch命令如何帮助创建具有指定目录结构的文件:

$ cd dir1
-bash: cd: dir1: No such file or directory
$ ls -ltrh "$FILE"
ls: cannot access './dir1/dir2/dir3/sample.txt': No such file or directory
$ mkdir -p "$(dirname $FILE)" && touch "$FILE"

Linux 中的*tree *命令帮助我们以树状格式理解目录层次结构:

$ tree dir1/
dir1/
└── dir2
    └── dir3
        └── sample.txt
2 directories, 1 file

2.2. 编写自定义 Bash 脚本

同样,如果我们想为后续文件创建多个路径,明智的做法是为这些重复性任务创建自定义 bash 脚本。

接下来,考虑下面的 bash 函数create_folder_file ——它本质上是一组重复的命令。该函数的主要目的是使我们的 bash 脚本更具可读性并防止代码重复。

**在 Linux 环境中,在脚本的第一行包含shebang **是很常见的,因为它有助于程序加载器执行正确的解释器

路径和文件信息由用户通过命令提示符作为输入参数给出。这些参数通过一个特殊的参数*$@进一步迭代,该参数从一个开始扩展位置参数。在这里,dirname *在 subshell 环境中执行,因为它在括号中给出。 但是,如果我们错过提供路径和文件信息,代码块会引发警报:

$ cat create_folder_file.sh
#!/bin/bash
create_folder_file() {
    for file_path_info in "$@"; do
        mkdir -p -- "$(dirname -- "$file_path_info")"
        touch -- "$file_path_info"
    done
}
if [ $# -lt 1 ]; then
    echo "Error: Argument missing, please enter the filename with fullpath.";
    exit 0;
fi

让我们为脚本提供可执行权限,看看当我们尝试执行create_folder_file.sh脚本时会发生什么:

$ ls -ltrh create_folder_file.sh
-rw-rw-r-- 1 tools tools 297 Sep 10 19:41 create_folder_file.sh
$ chmod 755 create_folder_file.sh
$ ls -ltrh create_folder_file.sh
-rwxr-xr-x 1 tools tools 297 Sep 10 19:41 create_folder_file.sh
$
$ tree full fullnew
full [error opening dir]
fullnew [error opening dir]
0 directories, 0 files

现在,让我们通过提供多个文件夹路径和文件信息来执行脚本:

$ ./create_folder_file.sh full/path/folder/file.txt fullnew/path/folder/file.txt
$
$ tree full fullnew
full
└── path
    └── folder
        └── file.txt
fullnew
└── path
    └── folder
        └── file.txt
4 directories, 2 files

此外,让我们创建一个*alias 来提供类似命令的执行视图。在这里,我们正在创建一个临时别名以进行快速说明。但是,也可以在.bashrc_aliases*文件中创建永久别名。

创建别名后,我们只需键入make并按TAB即可自动完成,如下图所示:

$ alias make_dir_file="./create_folder_file.sh"
$
$ make_dir_file 11/22/33/44.txt 44/55/66.txt 111/222/333/444.txt 444/555/666.txt
$ tree 11 44 111 444
11
└── 22
    └── 33
        └── 44.txt
44
└── 55
    └── 66.txt
111
└── 222
    └── 333
        └── 444.txt
444
└── 555
    └── 666.txt
6 directories, 4 files

3. 使用install命令

有时,一个真正有用的命令所引起的关注比它实际应得的要少。也许这就是 Linux install命令的情况。尽管它具有很棒的内置功能,甚至可以帮助我们设置权限、组、所有者等,但它却鲜为人知。

为了便于说明,让我们取两个变量SRC_FILEDEST_FILE的完整路径和文件名:

$ SRC_FILE=./source/file/path/sample.txt
$ DEST_FILE=./destination/file/path/destination-sample.txt
$
$ tree source destination
source
└── file
    └── path
        └── sample.txt
destination [error opening dir] 
2 directories, 1 file 

现在,让我们通过提供源和目标信息来执行install命令,如下图所示。该命令的*-D*选项有助于创建目标的前导组件,然后将文件从源复制到目标:

$ install -D "$SRC_FILE" "$DEST_FILE"
$
$ tree ./destination
./destination
└── file
    └── path
        └── destination-sample.txt
2 directories, 1 file

4. 使用 cp 命令

传统上,我们一直使用 Linux cp(复制)命令从可用源创建目标文件。它可以选择保留目录结构和权限:

$ mkdir dir4 && cp --parents dir1/dir2/dir3/sample.txt dir4
$ tree dir4
dir4
└── dir1
    └── dir2
        └── dir3
            └── sample.txt
3 directories, 1 file