Уважаемые коллеги!
Я хочу получить список файлов по маске, написал такой скрипт:#!/bin/bash
FileMask="*.xml | grep -v 'Default'" # маска файла, формат такой же, как и в командной строке
SrcPath="/usr/ScriptSL/USSD/in" # папка-источник, в которой надо найти все файлы по маске
FileListFN="/usr/ScriptSL/USSD/XML_20090827.lst" # название файла, в который надо вывести названия файлов# Скрипт должен выводить все файлы, которые подходят по маске, в один столбец, вырезать из них имя папки-источника и класть в указанный файл
ls -1 "$SrcPath"/"$FileMask" | sed s-"$SrcPath"/-- > "$FileListFN"Вот то, что получается, если сделать echo строки выше:
ls -1 /usr/ScriptSL/USSD/in/*.xml | grep -v 'Default' | sed s-/usr/ScriptSL/USSD/in/-- > /usr/ScriptSL/USSD/XML_20090827.lst
Это как раз то, что мне нужно, такая строка работает в shell, если её скопипэйстить. Однако, при попытке запуска shell вываливает мне то полный список файлов, подходящих к маске, потом пристыковывает к нему кусок скрипта после первого "|" (ничего не работает), то пытается искать grep, -v, 'Default' как отдельные файлы и ничего не находит. У меня есть чувство, что дело в кавычках. Какие кавычки надо ставить, чтобы в строку команды подставились значения переменных, а не результат их выполнения?
Заранее большое спасибо!
Хм, а если поставить маску
FileMask="*.xml"
, то скрипт работает. С полной маской (исключающей все файлы, название которых включает слово Default) я получаю такой вывод:
|: No such file or directory
grep: No such file or directory
-v: No such file or directory
'Default': No such file or directory
>Хм, а если поставить маску
>FileMask="*.xml"
>, то скрипт работает. С полной маской (исключающей все файлы, название которых
>включает слово Default) я получаю такой вывод:
>|: No such file or directory
>grep: No such file or directory
>-v: No such file or directory
>'Default': No such file or directoryСоветую использовать find.
Спасибо, но я хотел бы обойтись без find. Правильно сформированная строка работает так, как мне нужно, так что мне осталось только корректно подставить значения переменных в строку и запустить её! Похоже, что ls берёт не целиком сформированную строку "$SrcPath"/"$FileMask", а только до первого пробела, и использует значения, перечисленные в FileMask, как список входных директорий для команды. Я пробовал экранировать пробелы, указав в константе FileMask="*.xml\ |\ grep\ -v\ 'Default'", но это не помогло. Есть ли способ сначала сформировать текстовую строку полностью, а затем отправить её на выполнение всю целиком, без разделения?
Ваша проблема в том, что вы не понимаете элементарного - пайпу(|) в командах обрабатывает шелл, а не ls. Решить изначальную задачу можно по разному, например так:
eval "ls -1 $SrcPath/$FileMask | sed s- $SrcPath/-- > $FileListFN"
angra, спасибо за решение! Возможно, я действительно пока не врубился в концепцию. У меня всё заработало, именно такого результата я и хотел добиться!