有没有办法创建一个包含子目录和文档的新目录?

有没有办法创建一个包含子目录和文档的新目录?

对于 Web 开发实践,我在 Ubuntu 17.10 上使用 LAMP 堆栈。为此,我在 中创建了目录/var/www,每个目录都以一个项目命名。

要创建子目录,我使用终端并:

david@Ed:/var/www/html$ mkdir projectName
david@Ed:/var/www/html$ cd projectName
david@Ed:/var/www/html/projectName$ mkdir css img js
david@Ed:/var/www/html/projectName$ touch index.html
david@Ed:/var/www/html/projectName$ ls
css  img  index.html  js

这很有效。而且说实话,这绝不是件难事。但是,有没有什么方法可以简化这个过程呢?

我知道:

mkdir -p projectName/css

将创建css和父projectName目录(如果父目录尚不存在),但仍然需要创建另外两个目录和文件index.html(同样,这不是特别艰巨,但感觉应该是不必要的)。

理想情况下,我希望该命令mkdir <projectName>/var/www目录中运行时会创建<projectName>包含css、、img目录jsindex.html文档的目录(该文档理想情况下包含有效 html 文档的骨架*)。但是我承认滥用该mkdir命令可能会导致无法预料/可预测的边缘情况和后果,因此最好的折衷方案可能是某种脚本。

考虑到以上因素,我创建了以下(简单的)脚本:

#!/bin/bash
mkdir $@
cd $@
mkdir css img js
touch index.html

我将上述脚本调用如下:

./createDir.sh projectName

这可行但并不理想;问题如下:

  1. 创建的index.html类型为plain text document (text/plain),而不是预期的类型HTML document (text/html),当然
  2. 没有 HTML 文档的任何结构(如单个脚注中所述),因为我没有添加任何内容(并且还没有找到在脚本中创建所述内容的方法)。

此外,可以预见的是,cssjs目录也会 –理想情况下project.css– 使用完整的文档(和)创建project.js

那么,有没有什么方法可以让我——使用脚本或者其他方式——创建一个包含其子目录和文档的目录?


*举一个简单的例子:

<!DOCTYPE html>
<html>
<head>
  <title></title>
  <script src="js/project.js"></script>
  <link href="css/project.css" rel="stylesheet" />
</head>
<body></body>
</html>

答案1

您需要一些模板index.html来复制。但您可以即时创建这样的模板,然后将其复制到所需的目标。install命令可能会有帮助:

#!/usr/bin/env bash

template=$(mktemp);     # creates a temporary file, usually in /tmp

# Add the HTML code to that temporary file:
cat << EOF > $template
<!DOCTYPE html>
<html>
<head>
  <title></title>
  <script src="js/project.js"></script>
  <link href="css/project.css" rel="stylesheet" />
</head>
<body></body>
</html>
EOF

# "Install" the file with the given mode 
# and create any intermediate directories:
install -m 0644 -D $template /var/www/html/projectName/index.html

# remove the temporary file
rm $template;

exit 0;

您可能需要通过运行该脚本,sudo因为/var/...它不是全世界可写的。

答案2

我建议你做一些类似 adduser 命令使用skeleton 做的事情(https://unix.stackexchange.com/questions/285708/skeleton-directory-how-to-add-my-own-directories)。

在某处创建一个模板/框架,其中项目的所有初始文件和目录都按照项目中的组织方式进行组织。为新项目创建目录后,只需使用简单的复制将框架复制到目标位置即可:

cp -fvar <template directory> <destination directory>

cp命令中的参数如下:

f - force overwrite if destination already exists
v - verbose to show what is being copied
a - archive to preserve file permissions and ownerships
r - recursive to copy all directories and files.

我想在这里指出一个存档参数,它允许您在模板中设置正确的文件和目录权限和所有权。它们将在复制时保留,这样您项目中的文件就有了正确的权限,以便 Web 服务器可以访问它们。如果您想为每个项目设置不同的文件所有权,您必须手动执行此操作,同样使用简单的命令(chmod -R <permissions> <destination directory>chown -R <ownership> <destination directory)。

答案3

虽然这是一个不完美的答案,并且主要是通过我发布问题后的一些进一步搜索得出的,但我已经更新了我的脚本并解决了大部分问题。

我当前的脚本(尽管它确实很幼稚和简单)是:

#!/bin/bash
mkdir $@
cd $@
mkdir css img js
cat > index.html <<- "EOF"
<!DOCTYPE html>
<html>
<head>
  <title></title>
  <script src="js/project.js"></script>
  <link href="css/project.css" rel="stylesheet" />
</head>
<body></body>
</html>
EOF
cat > css/project.css <<- "EOF"
*, ::before, ::after {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}
EOF
cat > js/project.js <<- "EOF"
;
EOF

虽然这确实有效,但感觉有点肮脏。目前这种方法的主要问题是最后的 cat call:

cat > js/project.js <<- "EOF"
;
EOF

type这将生成一个可以通过其属性正确识别的文档application/javascript,而使用:

touch js/project.js

只需创建另一个文档 – 具有正确的文件类型扩展名 – 其类型属性为plain text document (text/plain)

相关内容