shell 将带有空格的文件名传递给imagemagic convert

yptwkmov  于 2022-11-16  发布在  Shell
关注(0)|答案(1)|浏览(144)

假设我有以下文件:

'CamScanner 11-06-2022 13.04.24_1.jpg'   'CamScanner 11-06-2022 13.04.24_20.jpg'
'CamScanner 11-06-2022 13.04.24_10.jpg'  'CamScanner 11-06-2022 13.04.24_21.jpg'
'CamScanner 11-06-2022 13.04.24_11.jpg'  'CamScanner 11-06-2022 13.04.24_22.jpg'
'CamScanner 11-06-2022 13.04.24_12.jpg'  'CamScanner 11-06-2022 13.04.24_23.jpg'
'CamScanner 11-06-2022 13.04.24_13.jpg'  'CamScanner 11-06-2022 13.04.24_24.jpg'
'CamScanner 11-06-2022 13.04.24_14.jpg'  'CamScanner 11-06-2022 13.04.24_3.jpg'
'CamScanner 11-06-2022 13.04.24_15.jpg'  'CamScanner 11-06-2022 13.04.24_4.jpg'
'CamScanner 11-06-2022 13.04.24_16.jpg'  'CamScanner 11-06-2022 13.04.24_5.jpg'
'CamScanner 11-06-2022 13.04.24_17.jpg'  'CamScanner 11-06-2022 13.04.24_6.jpg'
'CamScanner 11-06-2022 13.04.24_18.jpg'  'CamScanner 11-06-2022 13.04.24_7.jpg'
'CamScanner 11-06-2022 13.04.24_19.jpg'  'CamScanner 11-06-2022 13.04.24_8.jpg'
'CamScanner 11-06-2022 13.04.24_2.jpg'   'CamScanner 11-06-2022 13.04.24_9.jpg'

我想将这些文件转换为pdf格式。这些文件当前未按版本顺序列出,因此我尝试了以下操作:

convert $(ls -v) output.pdf

但是由于文件名中的空格,这个方法失败了。我想把文件名传递给按版本顺序列出的convert,并处理名称中的空格。我看到过一些这样的问题,他们在传递文件进行转换之前按某种顺序对文件进行排序,但没有一个在文件名中包含任何空格。如有任何建议,将不胜感激:)
编辑:我也试过:

ls -v | xargs -I% convert % output.pdf

但这只是将单个jpg转换为pdf。

dtcbnfnu

dtcbnfnu1#

您需要引用每个文件名。或者,试试这个。

readlines filearray <(ls -v)
convert "${filearray[@]}" output.pdf

一个更好的解决方案是在文件名中使用机器可读的日期和用零填充的序列号,这将使它们对人类读者来说是明确的,并轻松地解决排序顺序问题。

for file in CamScanner\ ??-??-????\ ??.??.??_*.jpg; do
    tail=${file##*_}
    printf -v idx %04i ${tail%.jpg}
    mv "$file" "CamScanner-${file:17:4}-${file:14:2}-${file:11:2}_${file:22:8}_$idx.jpg"
done

演示,各种各样:https://ideone.com/Svl6uQ

相关问题