提问人:RSTom 提问时间:2/18/2021 最后编辑:brombeerRSTom 更新时间:3/11/2021 访问量:84
Linux 脚本运行另一个需要双引号的命令
Linux script to run another command which requires double quotes
问:
我正在做噩梦,试图让它正确运行。我已经使用 php 代码做得很好,但问题是命令超时了很多文件。我以为我可以通过盒子本身上的 ssh 轻松做到这一点,但我无法让它做我想做的事。
在PHP中,我正在执行以下操作:
$command='/usr/bin/convert "'. $LocalPDFURL . '[1]" -quality 70% "' . $LocalJPGURL . '"' ;
我需要搜索pdf文件,如果没有使用pdf的第一页生成jpg,请检查它们是否具有具有相同文件名的.jpg。以上在 php 中工作正常。但是在 linux shell 脚本中,无论我尝试过什么,它都无法正常工作。我尝试了各种组合,它只是将整个内容输出为字符串或错误,因为它没有传递指定完整文件路径所需的双引号(它们包含空格)。
我的脚本是这样的:
format=*.pdf
wpath=$format
for i in $wpath;
do
if [[ "$i" == "$format" ]]
then
echo "No PDF Files to process!"
else
echo "full file name: $i"
FILE="${i%.pdf}.jpg"
if [ -f "$FILE" ]; then
echo "$FILE exists."
else
ORIGINAL=\""${FILE%.jpg}.pdf\""
QFILE=\""$FILE%\""
echo "$FILE does not exist. Creating PDF Cover JPG!"
command="/usr/bin/convert "\""$ORIGINAL"\" 1 -quality 65% $QFILE 2>&1"
echo $command
fi
fi
done
我只想构建命令并执行它。
php 命令输出如下所示...
"/usr/bin/convert "/home/test/1.pdf" 1 -quality 65% "/home/test/1.jpg" 2>&1"
并且运行良好。
我尝试过单引号、双引号转义等。请有人帮忙!
答:
0赞
qmeeus
2/18/2021
#1
所以我的建议如下:
- 在 Bash 中创建一个函数来做你想要的(即:给定一个 PDF 文件,检查对应的 JPG 文件是否存在,如果没有转换它)
- 将该功能应用于所有 PDF 文件
maybe_convert(){
! [ -f "${1%.*}.jpg" ] && echo "/usr/bin/convert \"$1\" 1 -quality 65% \"${1%.*}.jpg\"" || echo $1 exists
}
export -f maybe_convert
find . -type f -name "*.pdf" | xargs -I{} bash -c "maybe_convert \"{}\""
上面的代码片段适用于以下文件结构(假设您已将代码片段保存在名为 ):convert_image.sh
$ ls testdir/
'file 1.jpg' 'file 1.pdf' 'file 2.pdf' 'file 3.pdf'
$ bash convert_image.sh
/usr/bin/convert "./testdir/file 3.pdf" 1 -quality 65% "./testdir/file 3.jpg"
/usr/bin/convert "./testdir/file 2.pdf" 1 -quality 65% "./testdir/file 2.jpg"
./testdir/file 1.pdf exists
评论
0赞
RSTom
2/18/2021
谢谢。目前,使用上面的脚本,我得到了所有文件。我可以在脚本中创建函数,但是如何使用我使用的包含完整 pdf 文件名的 $ORIGINAL 变量调用它?我试过使用你的代码,但我无法让它工作。我还尝试单独使用您的代码,它只是说“没有这样的文件或目录”。
0赞
RSTom
2/19/2021
我已经设法添加了该函数并正确调用了它。但是,双引号在函数中不起作用。文件名中包含空格,因此转换程序的输出需要用双引号括起来。它现在正在输出命令,但它在文件名中的第一个空格处截断了它。即“我的文件名 1”被输出为“我的”。如上所述,我试图将文件名括在$QFILE中的双引号中,不幸的是,这些都不起作用。
0赞
qmeeus
2/22/2021
尝试在最后一行的大括号周围加上引号(就像我更新了答案一样)
0赞
RSTom
2/24/2021
不,它仍然不起作用。输入文件名在第一个空格处被截断。“my file name1”仍然输出为“my”。
0赞
qmeeus
2/24/2021
您是否还在文件名变量的第一次出现周围添加了引号(即在 中)?我忘了在我之前的评论中提到它[ -f "${1%.*}.jpg" ]
评论