如何创建多个文本文件,其中包括特定目录中文件的文件名,每个文本文件最多 999 行?
我从这个开始:
find ./J0902-405/*.evt -maxdepth 1 -type f -fprintf files_xselect.list %f\n
它将文件名正确写入文本文件中。 但之后,我需要设置 999 行限制,在该限制之后,创建另一个具有以下 999 名称的文本文件,依此类推,直到列出所有 *.evt 文件。
find ./J0902-405/*.evt -maxdepth 1 -type f | split -l999 -
从手册页:
NAME
split - split a file into pieces
SYNOPSIS
split [OPTION]... [INPUT [PREFIX]]
DESCRIPTION
Output fixed-size pieces of INPUT to PREFIXaa, PREFIXab, ...; default size is 1000
lines, and default PREFIX is `x'. With no INPUT, or when INPUT is -, read standard
input.
-l, --lines=NUMBER
put NUMBER lines per output file
@DopeGhoti的答案是正确的方法,但让我为那些刚接触split
的人(像我一样)充实一下:
find ./J0902-405 -maxdepth 1 -name '*.evt' -type f -printf '%fn' |
split -l 999 -d - files_xselect.list.
-name ...
带有引号的文件名模式,让我们找到做路径名扩展(与 shell 相反 - 让 shell 和find
都做这项工作没有意义)。-printf '%fn'
确保仅输出文件名(无路径组件),就像在 OP 中一样。-l 999
指定拆分大小(以行为单位);默认值为 1000。-d
导致数字后缀用于输出文件(00
、01
、...)而不是默认字母(aa
、ab
、...)[注意:在OSX上不起作用];默认后缀长度为2;要控制数字/字符的数量。 在后缀中,请使用-a {length}
。-
会导致split
从 stdin 读取 - 在这种情况下,输出来自find
.files_xselect.list.
是输出文件前缀;因此,我们得到的文件files_xselect.list.00
、files_xselect.list.01
、...
如果你想更好地控制输出文件名- 例如,将后缀数据移动到文件名的不同部分 - 你可以使用--filter
选项(注意:在OS X上不起作用),它接受一个shell命令,每个文件的输出数据被管道到,以及包含相应输出文件名名称的变量$FILE
;这使您有机会根据它:
例如,要创建名为files_xselect.00.list
, ... - 即将后缀数据放在文件扩展名之前,您可以使用:
... | split -l 999 -d --filter='> ${FILE}.list' - 'files_xselect.'
类似的东西
#!/bin/bash
for file in ./J0902-405/*.evt; do
[[ $i > 999 ]] && i=0 && j=$((j+1))
[[ -f $file ]] && i=$((i+1)) && echo "${file##*/}" >> "fileofnames$j.txt"
done