Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何使脚本独立于执行位置_Bash_Shell_Unix_Glob - Fatal编程技术网

Bash 如何使脚本独立于执行位置

Bash 如何使脚本独立于执行位置,bash,shell,unix,glob,Bash,Shell,Unix,Glob,我遇到了命令失败的问题,因为我希望它们在某个目录中执行,但事实并非如此 例如,我想做: pdfcrop --margins '0 0 -390 0' $pag "$pag"_1stCol.pdf 创建新的pdf文档,然后 mv `\ls /home/dir | grep '_1stCol'` /home/gmanglano/dir/columns 问题是,mv命令失败,因为它找到了文档,它试图从我执行脚本的目录中移动找到的文件,而不是从找到它的地方 这种情况经常发生在我身上,我觉得我缺少了一

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

例如,我想做:

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

事实上,如果出现上述失败,它就不在我启动脚本的目录中。

使用
ls
和backticks等命令,而不是蒙混过关,只需使用
find
命令即可。它是为查找文件而构建的,然后根据查找结果执行命令:

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

这是在
/home/dir
中查找与名称
*\u 1stCol.pdf
匹配的文件,然后移动它们。
{}
是找到的文件的标记。

不要用
ls
和backticks等来蒙混过关,只需使用
find
命令即可。它是为查找文件而构建的,然后根据查找结果执行命令:

 find /home/dir -name "*_1stCol.pdf" -exec mv {} /home/gmanglano/dir/columns \;
这是在
/home/dir
中查找与名称
*\u 1stCol.pdf
匹配的文件,然后移动它们。
{}
是找到的文件的标记。

:如果将
mv
命令简化为

mv /home/dir/*_1stCol.pdf /home/gmanglano/dir/columns
这样,您就不会遇到错误目录的问题。

:如果您将
mv
命令简化为

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

这样,您就不会在错误的目录中遇到问题。

顺便说一句,如果您引用了
$pag
的两个扩展名,就更好了,就像在
pdfcrop--margins'0 0 0-3900''$pag”“${pag}{u 1stCol.pdf”
中一样,如果它包含空格,则可以将其拆分为任意数量的独立
pdfcrop
参数,通配符等(或者是空的,在这种情况下它可以变成零参数)。这里不需要
\ls
(尽管无论如何你不应该非交互式地使用
ls
)——脚本中没有别名,除非你显式地打开并定义它们(在非交互式shell中默认情况下它们是关闭的)。顺便说一句,最好是引用
$pag
的两个扩展名,如
pdfcrop--margins'0 0 0-3900'$pag”“${pag}}u 1stCol.pdf”
,而不引用第一个扩展名,如果它包含空格、通配符等,则可以将其拆分为任意数量的独立
pdfcrop
参数(或者是空的,在这种情况下它可以变成零参数)。这里不需要使用
\ls
(尽管您无论如何都不应该以非交互方式使用
ls
)——脚本中没有别名,除非您显式地打开并定义它们(在非交互shell中默认情况下,它们是关闭的)。如果我要进行反向搜索,该怎么办?我一直在反复使用grep和find来完成这项任务,在这个例子中,我最终使用了mv
\ls/home/dir | grep-xv“pdf.pdf”
/home/dir2,这就是为什么要这么奇怪地做的原因。有什么想法吗?我无法找到如何使用findI进行查找。我认为
find
仍然是一个很好的解决方案。用于使用
find
中的
-not
标志。这是一个非常通用的工具,但它正在寻找一个正则表达式。有了grep-xv,我可以匹配一个确切的名字。抱歉,如果我把问题复杂化了。当我想进行否定搜索时,该怎么办?我一直在反复使用grep和find来完成这项任务,在这个例子中,我最终使用了mv
\ls/home/dir | grep-xv“pdf.pdf”
/home/dir2,这就是为什么要这么奇怪地做的原因。有什么想法吗?我无法找到如何使用findI进行查找。我认为
find
仍然是一个很好的解决方案。用于使用
find
中的
-not
标志。这是一个非常通用的工具,但它正在寻找一个正则表达式。有了grep-xv,我可以匹配一个确切的名字。对不起,我把问题复杂化了。