我正在尝试编写一个简单的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"
永远不要这样做。请改用切普纳的答案(或索科维的答案(