2017-09-25 88 views
1

我遇到了命令失败的问题,因为我期望它们在某个目录中执行,但情况并非如此。如何使脚本独立于执行的位置

比如我想做的事:

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 

当有,其实,说失败,它只是不是我发起了脚本的目录。

+1

顺便说一句,如果你同时引用'$ pag'的扩展 - 比如'pdfcrop --margins'0 0 -390 0'“$ pag”“$ {pag} _1stCol.pdf”' - without引用第一个,如果它包含空格,通配符等(或者是空的,在这种情况下它可以变成* zero *参数),它可以分成任意数量的单独的'pdfcrop'参数。 –

+1

这里不需要'\ ls'(尽管你不应该使用'ls'非交互) - 脚本中没有别名,除非你明确地打开它们并定义它们(它们关闭非交互式shell中的默认设置)。 –

回答

4

而不是用ls和反引号和所有这些,只需使用find命令。它的建成,对于查找文件,然后执行基于该发现结果的命令:

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

这是寻找在/home/dir姓名相符*_1stCol.pdf的文件,然后移动它们。 {}是找到的文件的标记。

+0

当我想进行负面搜索时怎么办?我一直在使用grep来回查找并找到这个任务,在这种情况下,我最终使用了** mv'\ ls/home/dir | grep -xv“pdf.pdf”'/ home/dir2 **,这就是奇怪的原因。有任何想法吗?我无法找到如何与查找 –

+0

我认为'find'仍然是一个很好的解决方案。 [检查这个问题](https://stackoverflow.com/questions/1341467/unix-find-for-finding-file-names-not-ending-in-specific-extensions)使用'-not'标志'find'。这是一个可怕的多功能工具。 – JNevill

+0

但是,这是寻找一个正则表达式。用** grep -xv **,我可以匹配确切的名称。对不起,如果我是过度复杂的问题。 –

3

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

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

,那么你不会有一个问题,在错误的目录之中。

相关问题