У меня есть следующая команда bash:
$(ls -l /var/ | grep www) > cat folder_exists
, но она не работает должным образом. Я надеюсь достичь команды, которая проверяет, есть ли папка www внутри папки /var/
, и выводит результат этой конкретной команды в файл folder_exists
. Я также пытался многократно вводить команду, например,
cat $(ls -l /var/ | grep www) > folder_exists
или даже
cat $(ls -l /var | grep www) > folder_exists
на случай, если удар коснулся, но безрезультатно.
Моя проблема в том, что, хотя я создаю файл folder_exists
, мне не удается распечатать вывод на него. Может кто-нибудь показать мне, где я ошибся?
Лучше сделайте это:
if [ -d /var/www ] ; then touch folder_exists ; else touch folder_absent ; fi
Первая версия команды делает следующее: $( ... )
сначала заменяется тем, что было произведено ...
. Так как Вы называете ls-l | grep www, Вы или получаете строку с несколькими словами или ничем. В первом случае это предпринято, чтобы быть выполненным, но это имеет мало смысла. Что Вы получите, если Вы введете
drwxr-xr-x 15 root root 4096 Aug 20 13:48 log
в командной строке? Нет никакой названной команды drwxr-xr-x
. Если Вы используете cat $( ls -l /var | grep www)
форма, затем сначала $( ... )
заменяется тем, что было произведено ...
, затем кошка интерпретирует его как список файлов кошке (запускающийся с drwxr-xr-x
; скорее всего, нет такого файла).
Кроме того, при попытке сделать что-то как этот:
command > cat file
То, что произойдет, является этим cat
интерпретируется как имя файла для хранения вывода command
, и не как команда. Интерпретировать cat
как команда, Вам нужен знак канала, как Вы правильно используемый в ls | grep:
command | cat
Однако, если Ваша цель состоит в том, чтобы сохранить вывод команды в файле, то просто используют
command > file
На самом деле, Вы могли сделать
ls /var | grep www > file
Этот файл будет пуст, только если нет никакой www папки в ls. Но остерегайтесь! если будет папка,/var/ewwwocks, то файл будет также содержать строку. Лучше использовать просто
ls /var/www > file
Короче говоря, используйте условную конструкцию если...; затем...; еще...; fi
Удалите круглую скобку.
ls -l /var/ | grep www > folder_exists
Работает просто великолепно.
-l
аргумент ls
причины это для включения большой посторонней информации, которая испачкает grep. Корректная команда была бы ls -a /var/ | grep www > folder_exists
.
Я предложил бы использовать find
для такой задачи:
find /var -type d -name '*www*' -maxdepth 1
-name '*www*'
соответствия что-либо назвало что-то с www
, используйте -iname
, если соответствие должно быть нечувствительным к регистру. find
является рекурсивным по умолчанию, таким образом, maxdepth
опция гарантирует, что только /var/*www*
подобраны. -type d
указывает, что это должен быть каталог.