Назад | Перейти на главную страницу

Bash-скрипты: использование подстановочных знаков

У меня две разные папки.

Первый содержит символические ссылки с именами моих серверов (например: 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"*; 

Вам, наверное, вообще не нужны цитаты. Имея * внутри двойных кавычек останавливает его раскрытие.