如何用一个命令创建一行目录?

0 filesystem command-line directory mkdir

使用mkdir命令,如果我希望这个位置存在,而到目前为止~/test/panda/fat只有~它的一部分存在,我必须做这样的事情:

mkdir ~/test
mkdir ~/test/panda
mkdir ~/test/panda/fat
Run Code Online (Sandbox Code Playgroud)

虽然如果我可以运行类似的东西mkdir ~/test/panda/fat而不是仅仅得到这个错误会更有用:

mkdir: cannot create directory ‘/home/$USER/test/panda/fat’: No such file or directory
Run Code Online (Sandbox Code Playgroud)

其实有它创建的目录test~,然后将目录panda~/test,然后最终的目录fat在子目录。我错过了什么吗?有没有办法做到这一点,因为它会非常有用?什么会实际上甚至在某些情况下更加有用的是我也能还自动创建在最后一个文件,以便它会创建所有这些目录,然后在文件bamboo.txtfat,并为所有这是在同一个命令(虽然显然不需要最后有一个文件)。

如果还没有可以执行此操作的命令(如果没有,我会感到惊讶),那么我该如何制作脚本来做到这一点?

我正在使用 GNOME 3.18 运行 Ubuntu GNOME 15.10。

hee*_*ayl 8

使用以下-p选项mkdir

mkdir -p ~/test/panda/fat
Run Code Online (Sandbox Code Playgroud)

来自man mkdir

-p, --parents
              no error if existing, make parent directories as needed
Run Code Online (Sandbox Code Playgroud)

例子:

% mkdir /tmp/foo/bar
mkdir: cannot create directory ‘/tmp/foo/bar’: No such file or directory

% mkdir -p /tmp/foo/bar    ## Done
Run Code Online (Sandbox Code Playgroud)

现在关于在自动创建中间不存在的目录之后创建文件,简单地说 - 你不能一次性完成。

最多可以在目录生成一后添加文件生成命令:

mkdir -p ~/test/panda/fat && touch ~/test/panda/fat/bamboo.txt
Run Code Online (Sandbox Code Playgroud)

您可以对touch命令使用历史扩展以使其更短或为方便起见创建一个 shell 函数。


这是一个可以完成这项工作的shell函数:

create_file_dir() {
    [ "$#" -ne 2 ] && echo 'Insufficient Arguments' ||

        case "$1" in -d)    mkdir -p "$2" && echo "Directory '"$2"' Created" ;;

                     -f)    mkdir -p "${2%/*}" && touch "$2" \
                              && echo "File '"$2"' Created" ;;

                      *)    echo "Invalid Argument"
        esac
}
Run Code Online (Sandbox Code Playgroud)

将代码片段放在您的~/.bashrc, 中,source ~/.bashrc并将其用作:

create_file_dir -d /directories/to/create  ##For only directories
create_file_dir -f /path/to/file  ## For file with intermediate dirs
Run Code Online (Sandbox Code Playgroud)

警告:如果文件已经存在,touch将更改时间戳。

例子:

$ create_file_dir -d /tmp/spam/egg/
Directory '/tmp/spam/egg/' Created

$ create_file_dir -f /tmp/spam/egg/foobar
File '/tmp/foo/bar/foobar' Created

$ create_file_dir /spam/egg
Insufficient Arguments

$ create_file_dir -m /spam/egg
Invalid Argument
Run Code Online (Sandbox Code Playgroud)