Есть ли способ создать новый каталог, содержащий подкаталоги и документы?

Для практики веб-разработки я использую стек LAMP в Ubuntu 17.10. Для этого я создаю каталоги в /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

Это работает, но не идеально; проблемы:

  1. созданный index.html имеет тип plain text document (text/plain), а не ожидаемый HTML document (text/html)и конечно
  2. не имеет структуры документа 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>

3 ответа

Я бы посоветовал вам сделать что-то наподобие команды adduser, работающей со скелетом ( 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.

Я хотел бы указать здесь параметр архива, который позволяет вам установить правильные права доступа к файлам и каталогам и владельцам шаблона. Они будут сохранены при копировании, и таким образом у вас есть файлы в проекте с правильными правами доступа к ним для веб-сервера. Если вы хотите иметь разных владельцев файлов для каждого проекта, вам придется сделать это вручную, снова с помощью простых команд (chmod -R <permissions> <destination directory> а также chown -R <ownership> <destination directory).

Вам понадобится шаблон для вашего 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/... не для записи в мире.

Несмотря на то, что это несовершенный ответ, и, в основном, он создается с помощью дополнительных поисков после того, как я опубликовал вопрос, я обновил свой сценарий и решил большинство проблем.

Мой текущий сценарий (одинаково наивный и простой, хотя, конечно, так и есть):

#!/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:

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

Это для создания документа, который правильно идентифицирован его type собственность как application/javascriptтогда как используя:

touch js/project.js

Просто создает еще один документ - с правильным расширением типа файла - чей атрибут типа plain text document (text/plain),

Другие вопросы по тегам