拆分文件并知道生成了多少文件

Ger*_*alt 5 shell split files

我使用以下几行将文件拆分为更小的部分:

split --line-bytes=100M -d $input $output/FILENAME
echo "$input was split into ??? 100MB files." >> demo.log
Run Code Online (Sandbox Code Playgroud)

之后,我需要在日志文件中写入从该拆分中生成了多少个较小的文件。有没有办法做到这一点?

don*_*sti 3

最简单的方法是将结果片段名称保存在数组中,例如

splitarr=($output/FILENAME*)
Run Code Online (Sandbox Code Playgroud)

并使用 获取数组长度(元素数量)${#splitarr[@]}。这假定唯一与该模式匹配的文件名是由该split命令生成的文件名。


您似乎正在使用gnu split,因此这里有一些其他方法可以做到这一点:您可以添加选项--verbose(有关man详细信息,请参阅页面)并只计算split打印到的行stdout并将其保存到变量中:

ct=$(split --verbose --line-bytes=100M -d $input $output/FILENAME | wc -l)
Run Code Online (Sandbox Code Playgroud)

您可以使用鲜为人知的选项获得相同的结果--filter

ct=$(split --filter='printf %s\\n;cat >$FILE' --line-bytes=100M -d $input $output/FILENAME | wc -l)
Run Code Online (Sandbox Code Playgroud)

或者,如果您知道只有您的split命令会在接下来的几N秒钟内在该目录中创建文件,您可以用来inotifywatch收集例如close_write事件的统计信息:

inotifywatch . -t 20 -e close_write
Run Code Online (Sandbox Code Playgroud)

将监视当前目录close_write事件,并输出如下内容:

Establishing watches...
Finished establishing watches, now collecting statistics.
total  close_write  filename
11     11           ./
Run Code Online (Sandbox Code Playgroud)

所以这只是从表中提取该数字的问题(例如将其通过管道传输到awk 'END{print $2}';还要记住前两行打印在stderr