如何通过 pdfjam 的 Unix 工具正确枚举它?

如何通过 pdfjam 的 Unix 工具正确枚举它?

我需要正确的命令枚举pdfjam *.pdf --nup 1x1。手册中没有任何内容pdfjampdfjoin因此我正在考虑 Bash 方法和/或find方法。没有正确枚举的失败输出示例,其中我省略了一些重复

ls -1 *
10 Heart Disorders.pdf
11 Red Blood Cell Disorders.pdf
...
19 Kidney Disorders.pdf
1 Cell Injury.pdf
20 Lower Urinary Tract and Male Reproductive Disorders.pdf
21 Female Reproductive Disorders and Breast Disorders.pdf
2 Inflammation and Repair.pdf
4 Water.pdf
5a Prematurity and intrauterine growth retardation.pdf
5 Genetic and Developmental Disorders.pdf
6 Environmental Pathology.pdf
...
9 Vascular Disorders.pdf

预期产出

1
2 
...
5
5a
... 
10
11
...
20
21

5...一个挑战是和的存在5a...

操作系统:Debian 8.7

答案1

zsh

(LC_ALL=C; pdfjam ./*.pdf(n) --nup 1x1)

会工作。(n)是一个zsh 全局限定符用于数字排序。在 C 语言环境中,按空格排序在前面,而"5a "在后面排序。在其他一些语言环境中,可以排序在前面,因为空格和大小写将在第一遍中被忽略(并且出现在 之前)"5 G"a"a "" G"AG

对于其他 shell 以及 GNU 或兼容系统,您可以执行以下操作:

printf '%s\0' ./* | LC_ALL=C sort -t/ -znk2 |
  xargs -r0 sh -c 'pdfjam "$@" --nup 1x1' sh

请注意,如果文件列表太大,那么在使用该zsh方法时,您会收到一个错误,在这里,它将运行几个pdfjam,这可能也不是您想要的(并且可能不会被注意到)。

另一种方法不是使用LC_ALL=C上面的方法来确保空格在 before 之前排序a,而是按数字排序但按关系排序,仅在第一个字段上按词法排序(根据区域设置规则):

printf '%s\0' [0-9]* | sort -z -k1n -k1,1 |
  xargs -r0 sh -c 'pdfjam "$@" --nup 1x1' sh

如果在您的区域设置中忽略大小写进行排序,则允许5a在之前进行排序。不过之前仍然会排序。5B05a5

使用bash4.4 及更高版本,您还可以执行以下操作:

readarray -td '' files < <(
  printf '%s\0' [0-9]* | sort -z -k1n -k1,1)
pdfjam "${files[@]}" --nup 1x1

相关内容