Linux 在Bash中列出每个文本文件的文件名,但不超过一个限制
如何创建多个文本文件,包括特定目录中文件的文件名,每个文本文件最多可创建999行 我从这里开始:Linux 在Bash中列出每个文本文件的文件名,但不超过一个限制,linux,bash,shell,command-line,Linux,Bash,Shell,Command Line,如何创建多个文本文件,包括特定目录中文件的文件名,每个文本文件最多可创建999行 我从这里开始: find ./J0902-405/*.evt -maxdepth 1 -type f -fprintf files_xselect.list %f\\n 它会在文本文件中正确地写入文件名。 但在后面,我需要设置999行限制,在该限制之后,创建另一个包含以下999个名称的文本文件,依此类推,直到列出所有*.evt文件。类似于 #!/bin/bash for file in ./J0902-405/
find ./J0902-405/*.evt -maxdepth 1 -type f -fprintf files_xselect.list %f\\n
它会在文本文件中正确地写入文件名。
但在后面,我需要设置999行限制,在该限制之后,创建另一个包含以下999个名称的文本文件,依此类推,直到列出所有*.evt文件。类似于
#!/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
差不多
#!/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
find./J0902-405/*.evt-maxdepth 1-类型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
find./J0902-405/*.evt-maxdepth 1-类型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的答案是正确的,但让我来充实一下,对于那些新加入
拆分(像我一样)的人来说:
-name…
使用带引号的文件名模式,让find执行路径名扩展(与shell相反,让shell和find执行这项工作毫无意义)
-printf“%f\n”
确保只输出文件名(无路径组件),如OP中所示
-l 999
以行为单位指定拆分大小;默认值为1000
-d
导致输出文件(00
,01
,…)使用数字后缀,而不是默认字母(aa
,ab
,…)[注:在OSX上不起作用];默认后缀长度为2;控制位数/字符数。在后缀中,使用-a{length}
-
导致从stdin读取split
——在这种情况下,find
的输出
文件\u xselect.list.
是输出文件前缀;因此,我们得到文件filesxselect.list.00
,filesxselect.list.01
如果希望对输出文件名进行更多控制,例如,将后缀数据移动到文件名的不同部分,则可以使用--filter
选项(注意:在OS X上不起作用),该选项接受一个shell命令,每个文件的输出数据将通过管道传输到该命令,以及包含相应输出文件名名称的变量$FILE
;这使您有机会根据它修改输出文件名:
例如,要创建名为filesxselect.00.list的输出文件,…-i、 例如,要将后缀数据放在文件扩展名之前,可以使用:
... | split -l 999 -d --filter='> ${FILE}.list' - 'files_xselect.'
@DopeGhoti的答案是正确的,但让我来充实一下,对于那些新加入拆分(像我一样)的人来说:
-name…
使用带引号的文件名模式,让find执行路径名扩展(与shell相反,让shell和find执行这项工作毫无意义)
-printf“%f\n”
确保只输出文件名(无路径组件),如OP中所示
-l 999
以行为单位指定拆分大小;默认值为1000
-d
导致输出文件(00
,01
,…)使用数字后缀,而不是默认字母(aa
,ab
,…)[注:在OSX上不起作用];默认后缀长度为2;控制位数/字符数。在后缀中,使用-a{length}
-
导致从stdin读取split
——在这种情况下,find
的输出
文件\u xselect.list.
是输出文件前缀;因此,我们得到文件filesxselect.list.00
,filesxselect.list.01
如果希望对输出文件名进行更多控制,例如,将后缀数据移动到文件名的不同部分,则可以使用--filter
选项(注意:在OS X上不起作用),该选项接受一个shell命令,每个文件的输出数据将通过管道传输到该命令,以及包含相应输出文件名名称的变量$FILE
;这使您有机会根据它修改输出文件名:
例如,要创建名为filesxselect.00.list的输出文件,…-i、 例如,要将后缀数据放在文件扩展名之前,可以使用:
... | split -l 999 -d --filter='> ${FILE}.list' - 'files_xselect.'
+我以前从未听说过split,每天都在学习一些知识。POSIX中有一个很好的真理,那就是大多数时候,已经有了用于作业的工具,用于$job
的足够简单的值。(:+1以前从未听说过split,每天都在学习一些知识。POSIX中有一个非常重要的真理,即大多数时候,已经有了用于作业的工具,用于$job
的足够简单的值(: