我想在所有子目录中的每个 PDF 上执行一个脚本,但我遇到了包含空格的文件名的问题。我搜索了很多,这篇文章似乎是一个解决方案,但我找不到让我的脚本工作的方法。
在文件夹中,这很好用:
for f in *.pdf; do
filename=$(basename -- "${f}") && extension="${filename##*.}" && filename="${filename%.*}" && outpt="$filename-compressed.pdf"
echo "$filename"
echo "$outpt"
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE \
-dQUIET -dBATCH -sOutputFile="$outpt" "${f}";
# rm "${f}";
done;
然后我尝试反复搜索(在添加“gs -sDEVICE=pdfwrite ......”之前)
for f in $(find "$(pwd)" -name '*.pdf'); do
filename=$(basename -- "${f}") && extension="${filename##*.}" && filename="${filename%.*}" && outpt="$filename-compressed.pdf"
echo "$filename"
echo "$outpt"
done
但我无法正确获取文件名。可能是因为文件名中的空格?
如果您有想法,感谢您的帮助!
------------------ 解决了谢谢@steeldriver
find . -name '*.pdf' -execdir sh -c '
for f do
filename=${f##*/} && extension=${f##*.} \
&& filename=${filename%.*} && outpt=$filename-compressed.pdf
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile="$outpt" "$filename.pdf";
echo "$filename"
echo "$outpt"
# rm "$filename.pdf" # remove original
done' find-sh {} +
是的,
for filename in
会吐在当前IFS
变量中的字符上——默认情况下,空格和制表符以及换行符。虽然您可以使用 find并通过 null 分隔或 null 分隔的 shell循环
-print0
读取结果,但您也可以使用 find或通过其位置参数将文件名明确传递给 shell 命令:xargs
while
-exec
-execdir