我需要正确的命令枚举pdfjam *.pdf --nup 1x1
。手册中没有任何内容pdfjam
,pdfjoin
因此我正在考虑 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"
A
G
对于其他 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
在之前进行排序。不过之前仍然会排序。5B
05a
5
使用bash
4.4 及更高版本,您还可以执行以下操作:
readarray -td '' files < <(
printf '%s\0' [0-9]* | sort -z -k1n -k1,1)
pdfjam "${files[@]}" --nup 1x1