У меня две разные папки.
Первый содержит символические ссылки с именами моих серверов (например: udcedpai101). Второй содержит список моих серверов, где файлы названы с именем сервера в начале и заканчиваются разными паттернами. (вот почему я использую подстановочный знак)
Имя файла инвентаризации всегда начинается с имени серверов (например: udcedpai101-print_manifest.txt
, legpspai101-print_inventaire.txt, legpspai101.myhome.qc.ca-print_inventaire.txt). Но они могут закончиться по-разному.
Вот команда, которую я выполняю:
for i in `ls -l /etc/domain.conf | grep ^l | awk {'print $9'}`*; do
ls -l "/var/opt/apache/htdocs/support/print_manifest/$i*";
done
(Частичный) вывод ...
> /usr/local/coreutils/bin/ls: cannot access
> /var/opt/apache/htdocs/support/print_manifest/udcedcgi101*: No such file or directory /usr/local/coreutils/bin/ls: cannot access
> /var/opt/apache/htdocs/support/print_manifest/udcedcgi102*: No such file or directory /usr/local/coreutils/bin/ls: cannot access
> /var/opt/apache/htdocs/support/print_manifest/udcedcgi103*: No such file or directory
Я пытаюсь использовать подстановочный знак (*) в своей команде, но он всегда возвращает ошибку о том, что файла нет, но я могу просмотреть файл, даже если он есть:
ls -l /var/opt/apache/htdocs/support/print_manifest/udcedcgi103*
-rw-r----- 1 TOTO TOTO 69455 Mar 9 00:00 /var/opt/apache/htdocs/support/print_manifest/udcedcgi103-print_manifest.txt
Мы будем очень благодарны за вашу помощь!
Вы не должны анализировать вывод из ls
. Вместо этого попробуйте что-нибудь вроде этого:
for i in /etc/domain.conf/*; do
test -L "$i" || continue # skip if not a symlink
ls -l "/var/opt/apache/htdocs/support/print_manifest/${i%%*/}"*
done
Вторая проблема заключается в том, что звездочка была заключена в двойные кавычки, поэтому оболочка искала udcedcgi101*
буквально, а не как шаблон для расширения.
В ${i%%*/}
извлекает только базовое имя файла, потому что теперь цикл перебирает полные имена путей, а не относительные пути внутри /etc/domain.conf/
.
Вам нужно переместить вторую цитату в ls
внутри цикла до *
+ Изменить
ls -l "/var/opt/apache/htdocs/support/print_manifest/$i*";
к
ls -l "/var/opt/apache/htdocs/support/print_manifest/$i"*;
Вам, наверное, вообще не нужны цитаты. Имея *
внутри двойных кавычек останавливает его раскрытие.