我是否忽略了一个Linux命令,该命令可以执行以下操作:(pseudo)
$ mkdir -R foo/bar/zoo/andsoforth
还是别无选择,只能一次创建一个目录?
mkdir -p foo/{bar,baz}/zoo/andsoforth
。很有用!
mkdir
只有6总共记录的标志。天哪,我觉得该命令默认情况下应该递归创建目录,如果您不希望这样做,则必须明确指定。
我是否忽略了一个Linux命令,该命令可以执行以下操作:(pseudo)
$ mkdir -R foo/bar/zoo/andsoforth
还是别无选择,只能一次创建一个目录?
mkdir -p foo/{bar,baz}/zoo/andsoforth
。很有用!
mkdir
只有6总共记录的标志。天哪,我觉得该命令默认情况下应该递归创建目录,如果您不希望这样做,则必须明确指定。
Answers:
$ mkdir -p foo/bar/zoo/andsoforth
mkdir -p
不是跨平台的,并不在每个shell工作
mkdir -p
对于大多数现代OS而言,使用是一种简单的方法:
mkdir -p foo/bar/zoo/andsoforth
但是,mkdir -p
在许多手册中不建议使用。阅读有关GNU的文档make
以及autoconf
有关使用问题的信息mkdir -p
:
跨平台安装和配置系统有自己的安全替代品mkdir -p
。
在命令行中使用的CMake:
cmake -E make_directory foo/bar/zoo/andsoforth
要在脚本中进行预处理的Autoconf:
AS_MKDIR_P(foo/bar/zoo/andsoforth)
要么:
AC_PROG_MKDIR_P(foo/bar/zoo/andsoforth)
但是,这些解决方案需要cmake
或autoconf
(M4
)工具进行安装(和可能的预处理)
您还可以将install-sh
脚本与-d
选项一起使用:
install-sh -d foo/bar/zoo/andsoforth
该脚本由autoconf
和automake
项目使用。我认为这一定是最安全的解决方案。
当时,我正在寻找一种/bin/sh
不依赖标准的跨平台解决方案,但是还没有找到。因此,我编写了下一个可能不理想的脚本,但我认为它符合大多数跨平台要求:
#! /bin/sh
cdirname() # cross platform alternative for 'dirname'
{
# $1 - path
test $# -eq 1 || { echo "Procedure 'cdirname' must have only one parameter. Scripting error."; exit 1; }
echo "$1" | sed -n -e '1p' | sed -e 's#//*#/#g' -e 's#\(.\)/$#\1#' -e 's#^[^/]*$#.#' -e 's#\(.\)/[^/]*$#\1#' -
}
mkd() # cross platform alternative for 'mkdir -p'
{
# $1 - directory to create
test $# -eq 1 || { echo "Function 'mkd' can create only one directory (with it's parent directories)."; exit 1; }
test -d "$1" && return 0
test -d "$(cdirname "$1")" || { mkd "$(cdirname "$1")" || return 1; }
test -d "$1" || { mkdir "$1" || return 1; }
return 0
}
该脚本可用于没有选项-p
for的旧系统mkdir
。
sed
的跨平台版本dirname
已添加到代码中。它的工作方式类似于dirname
(使用path纠正,/
仅具有基本名称的路径,具有尾随的/
路径,带有和不带有尾随\n
s的路径)。如果路径包含换行符或当前区域设置的某些无效字符,则此功能无法正常工作。它还用单个替换/
(//
,///
)的任何组合/
将行更改mkdir "$1" || return 1
为,test -d "$1" || { mkdir "$1" || return 1; }
因为mkdir
如果路径存在,则终止于错误,并且包含结构的路径需要进行此检查aaa\.
(如果aaa
不存在,则先前的版本会创建aaa
,然后尝试再次创建它)。
如果路径已经存在,则此版本的mkd不会产生错误(但是仍然有可能在并行执行中产生这样的错误),并且无法在命令行中获得多个目录。
mkdir -p
可能太旧了(而且我们谈论的至少已经有几十年了),以致没有printf
实用程序或支持--
来标记选项的终止。
cdirname
对于foo/bar//
,或目录名称包含换行符或当前语言环境中的无效字符,您将给出错误的答案。
printf
在POSIX系统上是安全的。POSIX系统支持mkdir -p
。mkdir -p
POSIX已指定数十年了。--
从80年代中期开始,从SysIII开始在AT&T系统上开始普及。我认为它最初是printf
作为ksh
内置函数出现的,后来由POSIX指定mkdir -p
。某些POSIX shell(如基于pdksh或yash的)仍然没有printf
内置。
选项-p
命令mkdir
使p ARENT目录根据需要(没有错误,如果存在):
mkdir -p foo/bar/zoo/andsoforth
另一种方法是,例如,使用&&
(如果指定的文件夹存在,则错误):
mkdir foo && mkdir foo/bar && mkdir foo/bar/zoo && mkdir foo/bar/zoo/andsoforth
链接运算符&&
用于将命令链接在一起,以便仅当前一个命令没有错误退出时才运行下一个命令。
当然,第一种方法更好。
mkdir foo foo/bar foo/bar/zoo/ foo/bar/zoo/andsofort.
这应该做。