Я использовал бы sed
, это действительно мощно, этот файл удара изменил бы значения:
#!/bin/bash
path_to_conf="/path/to/vsftpd.conf"
anonymous_=NEIN
local_=JA
chroot_=IDK
sed -c -i "s/\("anonymous_enable" *= *\).*/\1$anonymous_/" $path_to_conf
sed -c -i "s/\("local_enable" *= *\).*/\1$local_/" $path_to_conf
sed -c -i "s/\("chroot_local_user" *= *\).*/\1$chroot_/" $path_to_conf
Вы могли использовать цикл, чтобы сделать это, если необходимо заменить много переменных, но только с тремя ключами это более хорошо как это (по-моему).
Вам необходимо принять первый параметр из командной строки $ 1
. В идеале вы бы назначали, что для переменной dir = «$ 1»
. Если ничего не было предоставлено, то, кажется, вы хотите по умолчанию текущим каталогам .
. Вы можете сделать это с помощью Test -z «$ dir» && dir = '.'
или, более идиоматически просто используйте переменную и предоставляют значение по умолчанию «$ {dir: -.}»
.
Положить это вместе, вы могли бы иметь что-то вроде этого:
#!/bin/bash
DIR="$1"
echo "total directories: $(find "${DIR:-.}" -type d -ls | wc -l)"
echo "total files: $(find "${DIR:-.}" -type f -ls | wc -l)"
Кстати, оригинальный код, который вы опубликовали (до того, как я отредактировал ваш вопрос), не мог бы работать:
echo "total directories:" find . -type d | wc -l
Вам нужно было бы поставить найти. -тип d |. WC -L
в backticks `...` `
, или лучше еще, конструкция $ (...)
. Я использовал здесь второй подход. Для простых ситуаций они могут быть эквивалентны, но $ (...)
часто более надежны.
Файлы и каталоги могут иметь новые слова в их именах, поэтому вы не можете «просто» использовать WC -L
, как вы делаете.
Если вы хотите сценарий, который принимает параметр и рекурсивно считает файлы и каталоги, вы должны использовать:
#!/bin/bash
echo -n 'total directories:'; find "$1" -type d -printf \\n | wc -l
echo -n 'total files:'; find "$1" -type f -printf \\n | wc -l
и вызовите скрипт, предоставив каталог в качестве аргумента командной линии:
./your_script_name /home/e_g_your_home_dir.
хотя коротко, вышеупомянутый Один для каталогов (если вы не рассмотрите каталог, чтобы быть «в самом« сам »), вы также можете заменить WC -L
с чем-то, что может обрабатывать Nul-завершения« строки »и
Используйте -Print0
#!/bin/bash
echo -n 'total directories:'; find "$1" -type d -print0 | python -c "import sys; print len(sys.stdin.read().split('\0'))-2"
echo -n 'total files:'; find "$1" -type f -print0 | python -c "import sys; print len(sys.stdin.read().split('\0'))-1"
Если вы не хотите делать это рекурсивно (только подсчитание файлов / каталогов в указанном вами каталоге, и не те, которые в каталоге, который находится в указанном вами каталоге), вы должны добавить -макдет 1
после $ 1
параметра.