对于 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
目录js
和index.html
文档的目录(该文档理想情况下包含有效 html 文档的骨架*)。但是我承认滥用该mkdir
命令可能会导致无法预料/可预测的边缘情况和后果,因此最好的折衷方案可能是某种脚本。
考虑到以上因素,我创建了以下(简单的)脚本:
#!/bin/bash
mkdir $@
cd $@
mkdir css img js
touch index.html
我将上述脚本调用如下:
./createDir.sh projectName
这可行但并不理想;问题如下:
- 创建的
index.html
类型为plain text document (text/plain)
,而不是预期的类型HTML document (text/html)
,当然 - 没有 HTML 文档的任何结构(如单个脚注中所述),因为我没有添加任何内容(并且还没有找到在脚本中创建所述内容的方法)。
此外,可以预见的是,css
和js
目录也会 –理想情况下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)
。