提取從第 i 個元素到第 j 個元素的元素範圍,直到列表中的第 n 個元素
在一個目錄中,我有一定數量的文件。這可能是 53 個 txt 文件,但我也可能有 123 個文件。這些文件有各種隨機名稱,但都有文件句柄
.txt
我可以使用 ls 獲取所有文件的列表,並將其放入變數中。
list_of_txt_files=$(ls *.txt)
但我想將列表劃分為多個單獨的列表,每個列表只有 10 個元素 - 即一個包含 53 個 txt 文件的文件夾,應該給我 6 個列表。那是 5 個包含 10 個文件名的列表,以及第 6 個包含 3 個文件名的列表,我的目錄中有 123 個 txt 文件的範例應該給我 12 個包含 10 個文件名的列表,以及一個只有 3 個文件名的第 13 個列表.
以我的帶有 53 個 txt 文件的範例為例:列表號。1 將保留第一個文件直到第十個文件,並列出編號。2 將保留第 11 個文件直到第 20 個文件,依此類推。我將我的問題從列表中的第 i 個元素命名為第 j 個元素,因為我想其他人可能想要以不同的方式分解列表。也許從第一個文件到目錄中的第 100 個文件。
最終目標是能夠在 for do 循環中使用這些列表,並使用 cat 命令將每個列表的十個文件的內容寫到每組十個文件的一個文件中 - 即在我的範例中包含 53 個文件一個目錄,這會給我6個文件。其中前 5 個文件包含 50 個原始 txt 文件的內容,第 6 個文件包含最後剩下的 3 個 txt 文件的內容。
我考慮過使用 head 或 tail 命令,但不能完全弄清楚如何為這兩個命令指定範圍。
在帶有數組的外殼上,使用它們。用 Bash 說:
$ touch {01..53} $ files=(*) $ echo "${files[@]:0:10}" 01 02 03 04 05 06 07 08 09 10 $ for ((i = 0 ; i < ${#files[@]} ; i += 10 )) ; do echo "${files[@]:i:10}" ; # or # cat "${files[@]:i:10}" > set-$(( i / 10 )) done 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
子字元串擴展(數組切片)擴展為單詞列表,而
"${files[@]:i:10}"
不是單個字元串,因此您可以對其進行循環:for f in "${files[@]:i:10}" ; do somecmd "$f" done
不要這樣做
files=$(ls *.txt)
,ls
那裡完全是多餘的,無論如何它都是評估萬用字元的外殼。通常您只需將萬用字元模式保存到變數 (pat=*.txt
) 並在需要時使用它(不加引號),或者如果要將其擴展為實際文件名,請使用echo *.txt
而不是ls
. 對於處理文件名列表,如果您不受限於普通的 POSIX shell,則數組會更好。至於用
head
and拆分列表tail
,您需要執行類似| head -20 | tail -10
獲取第 11 到 20 行的操作。或者使用 sed:| sed -n 11,20p
。