在目录中,我有一定数量的文件。这可能是53个txt文件,但我也可能有123个文件。这些文件具有各种随机名称,但是都具有文件句柄.txt
我可以使用ls获取所有文件的列表,并将其放入变量中。
list_of_txt_files=$(ls *.txt)
但是我想将列表分成多个单独的列表,每个列表只有10个元素-即一个包含53个txt文件的文件夹,应该给我6个列表。那是5个具有10个文件名的列表,一个6个具有3个文件名的列表,而我的示例在目录中具有123个txt文件,应该给我12个具有10个文件名的列表,而13个仅具有3个文件名的列表。
以我的53个txt文件为例:列表号。1将保留第一个文件直到第十个文件,并列出编号。2将保留第11个文件到第20个文件,依此类推。我将问题的标题从列表中的第i到第j元素命名,因为我想其他人可能希望以不同的方式分解列表。也许从目录中的第一个文件到第100个文件。
最终目标是能够在for do循环中使用这些列表,并使用cat命令将每个列表的十个文件的内容写成每十个文件的一组文件-例如,在我的示例中,有53个文件一个目录,这将给我6个文件。其中前5个文件包含50个原始txt文件的内容,而第6个文件包含最后3个txt文件的内容。
我已经考虑过使用head或tail命令,但是无法完全确定如何为这两个命令指定范围。
在具有数组的shell上,使用它们。与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
和拆分列表tail
,您需要做一些事情,例如| head -20 | tail -10
获得第11到20行| sed -n 11,20p
。或者使用sed:。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句