UNIX中的ls命令

时间:2016-03-29 14:05:12

标签: shell unix ls

我必须命令获取某些类型文件的详细信息。文件名具有特定格式。前两个单词后跟生成文件的日期

e.g:

Report_execution_032916.pdf

Report_execution_033016.pdf

Word摘要也可以代替报告。

e.g:

Summary_execution_032916.pdf

因此在我的shell脚本中我放了这行代码

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

但是Model的价值总是被解析为' REPORT'因此我得到了:

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

我被困在如何解决模型的问题。

我无法在此处重现确切的代码。因此我改变了一些变量名。最初我使用了变量名称类型而不是模型。但Model是我在实际代码中使用的

5 个答案:

答案 0 :(得分:1)

您已将脚本更改为使用Model=Report${Model},并且您已在脚本中说过typeset -u Modeltypeset命令的-u选项(而不是declare - 它们是同义词)意味着“转换分配给所有大写字母的字符串”。

  

-u为变量分配值时,所有小写字符都将转换为大写。小写属性已禁用。

这解释了变量扩展中的大写REPORT。您可以通过写作来证明:

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

由于Model=[REPORT],它会回显typeset -u Model

  • 如果您不想要,请不要使用-u选项。

你也应该修复你的glob表达式:

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

使用$(…)代替反引号通常是一个好主意。

并且,作为一般观点,了解如何Debug a Bash Script并始终提供MCVE(How to create a Minimal, Complete, and Verifiable Example?),以便我们可以更轻松地查看您的问题。

答案 1 :(得分:0)

要注意的一些事项:

  • type通常是一个保留字,虽然它不会破坏您的脚本,但我建议您将该变量名更改为其他名称。
  • 您在$之前遗漏了{DATE},之后又有_*。如果日期是名称的最后一部分,那么最后也没有filefile=`ls ${type}_execution_*${DATE}.pdf`定义应为:

ls

尝试按部分调试代码:而不是执行echo,对每个变量执行ls,查看出现的内容,并将问题追溯到其原点。

作为@DevSolar pointed out,您可能在解析 Dim List1 = l1.Select(Function(e1) e1.FirstName).Except(l2.Select(Function(e2) e2.FirstName)).ToList Dim List2 = l2.Select(Function(e2) e2.FirstName).Except(l1.Select(Function(e2) e2.FirstName)).AsEnumerable 的输出时遇到问题。

答案 2 :(得分: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)

答案 3 :(得分:0)

Part of question: 
But the value of Model always gets resolved to 'REPORT' and hence I get:

这是因为您的脚本中已导出Model = Report

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

没有这样的文件我们的目录问题是由于额外的" _"你已经放在第3行的其他" *" 删除它,错误将消失。虽然,Model仍将解析报告

原创第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

答案 4 :(得分:0)

在控件到达我在问题中提到的代码行之前,还调用了一些其他脚本。在一个这样的脚本中有一个代码     typeset -u Model 这会将变量模型的值始终设置为大写,这就是抛出此错误的原因    ls:无法访问REPORT_execution_ 032916 _ .pdf:没有这样的文件或目录

对不起 我无法提供最小,完整和可验证的代码