在一个命令中创建Linux文件夹路径和文件
1. 概述
作为系统管理员,我们经常需要为管理它的应用程序创建带有空文件的嵌套目录。通常,当我们将文件复制到不存在的目标位置时,我们会收到“无文件或目录”错误。
显然,在终端中创建多个嵌套目录是一项繁琐且耗时的任务,需要以简单的方式创建目标目录和文件。
本教程将阐述在 Linux 系统中通过单个命令创建目录路径和文件的不同方法。现在,让我们深入了解它的本质。
2. 使用mkdir和touch命令
结合使用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命令在新路径中创建空文件。我们使用双 & 号来拉伸这两个命令。
双 & 号优于分号,因为后者同时执行两个命令,而前者仅在成功执行第一个命令后执行第二个命令**。
以下是mkdir和touch命令如何帮助创建具有指定目录结构的文件:
$ 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_FILE和DEST_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