【问题标题】:How to make script independent from where it is executed如何使脚本独立于执行位置
【发布时间】:2017-09-25 14:26:59
【问题描述】:

我遇到了命令失败的问题,因为我希望它们在某个目录中执行,但事实并非如此。

例如我想做的:

pdfcrop --margins '0 0 -390 0' $pag "$pag"_1stCol.pdf

创建一个新的pdf文档,然后

mv `\ls /home/dir | grep '_1stCol'` /home/gmanglano/dir/columns

问题是 mv 命令失败,因为它找到了文档,它试图从我执行脚本的目录中移动找到的文件,而不是从找到它的位置。

这种情况经常发生在我身上,我觉得我缺少一个概念,或者我认为这是错误的方式。

我得到的错误是:

mv: cannot stat '1stCol.pdf': No such file or directory

有的时候,其实是说fail,只是不在我启动脚本的目录下。

【问题讨论】:

  • 顺便说一句,如果你引用$pag 的两个扩展名更好——如pdfcrop --margins '0 0 -390 0' "$pag" "${pag}_1stCol.pdf"——不引用第一个,它可以分成任意数量的单独pdfcrop 参数,如果它包含空格、通配符等(或为空,在这种情况下它可以成为 个参数)。
  • 这里不需要\ls(尽管你不应该以非交互方式使用ls)——脚本中没有别名,除非你明确地打开它们并定义它们(它们在非交互式 shell 中默认关闭)。

标签: bash shell unix glob


【解决方案1】:

不要使用ls 和反引号等等,只需使用find 命令。它是为查找文件而构建的,然后根据该查找的结果执行命令:

 find /home/dir -name "*_1stCol.pdf" -exec mv {} /home/gmanglano/dir/columns \;

这是在/home/dir 中查找与名称*_1stCol.pdf 匹配的文件,然后移动它们。 {} 是找到的文件的令牌。

【讨论】:

  • 当我想进行否定搜索时怎么办?我一直在使用 grep 和 find 来完成这项任务,在这种情况下,我最终使用了 mv \ls /home/dir | grep -xv "pdf.pdf" /home/dir2 这就是这样做的原因很奇怪.有任何想法吗?我无法找到如何使用 find
  • 我认为find 仍然是一个很好的解决方案。 check out this question 用于在 find 中使用 -not 标志。这是一个非常通用的工具。
  • 但那是在寻找一个正则表达式。使用 grep -xv,我可以匹配一个确切的名称。对不起,如果我把问题复杂化了。
【解决方案2】:

Don't parse the output of ls:如果将mv命令简化为

mv /home/dir/*_1stCol.pdf /home/gmanglano/dir/columns

那么你就不会因为在错误的目录中而有问题。

【讨论】:

    猜你喜欢
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 2015-06-05
    • 1970-01-01
    • 2015-03-24
    相关资源
    最近更新 更多