Никакие из файлов и каталогов в конкретном каталоге в сценарии оболочки

Я использовал бы 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

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

0
04.05.2015, 17:57
2 ответа

Вам необходимо принять первый параметр из командной строки $ 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 `...` `, или лучше еще, конструкция $ (...) . Я использовал здесь второй подход. Для простых ситуаций они могут быть эквивалентны, но $ (...) часто более надежны.

0
28.01.2020, 02:36

Файлы и каталоги могут иметь новые слова в их именах, поэтому вы не можете «просто» использовать 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 параметра.

2
28.01.2020, 02:36

Теги

Похожие вопросы