我有一些文件(这些是每次随机生成的)在名称中有一个数字 - 在文件中,数字会重复。例如:
$(".container *").text()
我想将这些文件的内容合并到一个更大的文件file1_85.txt
file1_242.txt
file1_9.txt
。
我尝试使用的代码是:
file_all.txt
但是,for f in file1_*.txt; do (cat "${f}"; echo " ") >> file_all.txt; done
的内容如下所示:
file_all.txt
当我真的希望它看起来像这样:
file1_242.txt
file1_85.txt
file1_9.txt
如果bash按数字顺序捕获文件,会发生什么。
我试过这个:
file1_9.txt
file1_85.txt
file1_242.txt
哪个有效,但是我收到了错误消息"没有这样的文件或目录"当它通过一个没有匹配文件的数字时。而且,这非常耗时。有没有更好的方法来执行这项任务?
答案 0 :(得分:4)
假设文件的名称中没有任何换行符,并且您的GNU版本为sort
,则可以使用:
while read file; do
cat "$file"
echo
done < <(ls -1 file_*.txt | sort -V) > file_all.txt
如果您的sort
不支持-V
(例如OS X),您可以利用文件名一致性进行直接数字排序:
while read file; do
cat "$file"
echo
done < <(ls -1 file_*.txt | sort -t_ -n -k2,2) > file_all.txt
最后,如果您的文件包含换行符,您仍然可以使用sort
,但是您需要将-z
选项与其他使用NUL字节而不是换行符终止列表元素的工具结合使用:
find . -depth 1 -name 'file_*' -print0 | sort -zV | xargs -0 -I{} bash -c 'cat {}; echo'
将sort -zV
替换为sort -z -t_ -n -k2,2
,以替换缺少-V
选项的旧版GNU排序;但是,完全非GNU类型可能也不会有-z
。
答案 1 :(得分:4)
对于可能包含换行符的文件名:
$ find -name 'file1*' -print0 | sort -zV | xargs -0 cat
file1_9
file1_85
file1_242
或者,如果-V
选项不可用,
$ find -name 'file1*' -print0 | sort -z -n -t '_' -k 2 | xargs -0 cat
file1_9
file1_85
file1_242
这使用null分隔的文件名; -z
选项告诉sort
期望(并生成)空分隔文件名,xargs -0
也用于空分隔输入。
答案 2 :(得分:1)
你的蛮力&#34;如果:
,方法将起作用$ for f in file1_{1..99999}.txt; do [ -f "${f}" ] && cat "${f}" >> file_all.txt; done
比较:[ -f "${f}" ]
检查文件是否存在于cat
之前,避免出现错误消息。