2016-03-29 4 views
1

Мне нужно выполнить команду ls, чтобы получить информацию о некоторых типах файлов. Имя файла имеет определенный формат. Первые два слова с указанием даты, на которой файл был сгенерированКоманда ls в UNIX

т.д .:

Report_execution_032916.pdf

Report_execution_033016.pdf

резюме Слово также может прийти вместо отчета.

например:

Summary_execution_032916.pdf

Таким образом, в моем сценарии оболочки я ставлю эти строки кодов

DATE=`date +%m%d%y` 
Model=Report 
file=`ls ${Model}_execution_*${DATE}_*.pdf` 

Но значение модели всегда получает решенных к «Справке», и, следовательно, я получаю:

ls: cannot access REPORT_execution_*032916_*.pdf: No such file or directory 

Я застрял в том, как разрешение модели происходит здесь.

Я не могу воспроизвести здесь точный код. Поэтому я изменил некоторые имена переменных. Первоначально я использовал тип имени переменной вместо модели. Но модель является, по которой я использую в своей фактической код

+4

[Почему вы не должны разобрать выход LS] (http://mywiki.wooledge.org/ParsingLs). При этом я не вижу **, почему ** 'type' должен переходить в верхний регистр. Подождите ... ваши примеры имен файлов ** не ** имеют расширение '.pdf', а строка' file = 'ожидает один ...?!? – DevSolar

+0

Вы уверены, что вы опубликовали именно то, что у вас есть? '$ DATE' var не следует расширять, поскольку ваша команда неверна (отсутствует' $ '). Но ваш результат показывает, что это ... – Mat

+0

Привет, Спасибо за ответ. У выходных файлов MY есть расширение .pdf. Я соответствующим образом изменил вопрос и написал точную ошибку, которая была выброшена. –

ответ

0

Некоторые вещи, чтобы посмотреть на:

  • type обычно зарезервированное слово, хотя это не нарушит ваш сценарий, я предлагаю вам изменить это имя переменной в другое.
  • Вам не хватает $ до {DATE}, и после этого у вас есть дополнительно _. Если дата является последней частью имени, тогда нет смысла иметь * в конце. file определение должно быть:

file=`ls ${type}_execution_*${DATE}.pdf`

Попробуйте отладку кода по частям: вместо того, чтобы делать в ls, сделать echo каждой переменной, посмотрим, что выходит, и проследить проблему обратно к своему источнику ,

Как @DevSolar pointed out у вас могут возникнуть проблемы с разбором вывода ls.

0

В качестве обходного

ls | grep `date +%m%d%y` | grep "_execution_" | grep -E 'Report|Summary' 

ls фильтрует выход после этого.

touch 'Summary_execution_032916.pdf' 
DATE=`date +%m%d%y` 
Model=Summary 
file=`ls ${Model}_execution_*${DATE}*.pdf` 

работал нормально на

GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu) 
0
Part of question: 
But the value of Model always gets resolved to 'REPORT' and hence I get: 

Это связанно с тем, что в вашем сценарии вы экспортируемый Model = Отчет

Part of question: 
ls: cannot access REPORT_execution_*032916_*.pdf: No such file or directory 

Нет такого файл нашего выпуска каталога связано с дополнительными «_» и дополнительными «*», которые вы положили в свою 3-ю строку. Удалите его, и ошибка исчезнет. Хотя, модель будет по-прежнему полны решимости Сообщить

Оригинал 3-я строка:

file=`ls ${Model}_execution_*${DATE}_*.pdf` 

Изменить его

file=`ls ${Model}_execution_${DATE}.pdf` 

Над изменениями будет решить не удалось найти проблему.

Part of question 
I am stuck at how the resolution of Model is happening here. 

Я не уверен, что вы пытаетесь достичь, но если вы пытаетесь заполнить параметр файла с именем файла с anything_exection_someDate.pdf, то вы можете написать свой сценарий как

DATE=`date +%m%d%y` 
file=`ls *_execution_${DATE}.pdf` 

If you echo the value of file you will get 
Report_execution_032916.pdf Summary_execution_032916.pdf 
as the answer 
1

Вы изменили свой сценарий на использование Model=Report и ${Model}, и вы сказали, что у вас есть typeset -u Model в вашем скрипте. Опция -u команды typeset (вместо declare - это синонимы) означает «преобразовать строки, назначенные всем верхним регистром».

-u Когда переменной присваивается значение, все строчные буквы преобразуются в верхний регистр. Атрибут нижнего регистра отключен.

Это объясняет верхний регистр REPORT в переменном расширении. Вы можете продемонстрировать, написав:

Model=Report 
echo "Model=[${Model}]" 

Было бы эхо Model=[REPORT] из-за typeset -u Model.

  • Не используйте опцию -u, если вы этого не хотите.

Вы должны, вероятно, исправить выражение Глобо тоже:

file=$(ls ${Model}_execution_*${DATE}*.pdf) 

Использование $(…) вместо обратных кавычек, как правило, является хорошей идеей.

И, как правило, узнайте, как Debug a Bash Script и всегда предоставляйте MCVE (How to create a Minimal, Complete, and Verifiable Example?), чтобы мы могли легче видеть вашу проблему.

+0

Спасибо, Это помогло. И спасибо за ваши предложения. Я довольно новичок для обмена файлами, а также скриптов unix shell. Я обязательно буду иметь в виду эти моменты. –

0

Были и другие скрипты, которые были вызваны до того, как элемент управления достигнет строки кодов, которые я упомянул в вопросе.В одном из таких сценариев есть код typeset -u Model Это устанавливает значение переменной модели всегда в верхний регистр, из-за которой была вызвана эта ошибка. ls: невозможно получить доступ к REPORT_execution_ 032916_ .pdf: Нет такого файла или каталога

Я сожалею, что я не мог обеспечить минимальный, полный и проверяемый код

Смежные вопросы