使用Bash连接许多文件的前10个字节



我正在尝试编写一个简单的Bash循环,以连接目录中所有文件的前10字节。到目前为止,我有代码块:

for filename in /content/*.bin; 
do
cat -- (`head --bytes 10 $filename`) > "file$i.combined"
done

然而,这里的语法显然不正确。我知道内部命令:

head --bytes 10 $filename

归还我需要的东西;传递的文件名的前10个字节。当我使用时:

cat -- $filename > "file$i.combined"

代码是有效的,只是它连接了整个文件的内容。

如何将这两个函数组合起来,使循环连接所有循环文件的前10个字节

循环将为您进行串联(或者更确切地说,head的顺序执行的输出是按照循环本身的标准输出编写的(;您不需要使用cat

for filename in /content/*.bin; do
head --bytes 10 "$filename"
done > "file$i.combined"

使用GNU coreutils:中的head

head -qc 10 /content/*.bin > combined

对于ARG_MAX遇到问题的极不可能的情况(要么是因为非常长的文件名,要么是大量文件(,您可以使用

find /content -maxdepth 1 -name '*.bin' -exec head -qc 10 {} + > combined 

您应该使用@chepner的答案,但为了展示您如何使用cat

这里我们有一个递归函数,它将所有内容汇总到cat的单个副本中。

catHeads() {
local first="$1"; shift || return
case $# in
0) head --bytes 10 "$first" ;;
1) cat <(head --bytes 10 "$first") <(head --bytes 10 "$1");;
*) cat <(head --bytes 10 "$first") <(catHeads "$@");;
esac
}
catHeads /content/*.bin >"file$i.combined"

永远不要这样做。请改用切普纳的答案(或索科维的答案(

最新更新