列出 Bash 中每个文本文件的文件名,但不得超过限制



如何创建多个文本文件,其中包括特定目录中文件的文件名,每个文本文件最多 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导致数字后缀用于输出文件(0001、...)而不是默认字母(aaab、...)[注意:在OSX上不起作用];默认后缀长度为2;要控制数字/字符的数量。 在后缀中,请使用-a {length}
  • -会导致split从 stdin 读取 - 在这种情况下,输出来自find.
  • files_xselect.list.是输出文件前缀;因此,我们得到的文件files_xselect.list.00files_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

相关内容

  • 没有找到相关文章

最新更新