Bash

如何通過 Unix 工具正確列舉 pdfjam?

  • March 21, 2017

我需要正確列舉命令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

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‘s,這可能也不是您想要的(並且可能不會被注意到)。

而不是使用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

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

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

引用自:https://unix.stackexchange.com/questions/352686