新文件中每个文件的第一行

时间:2012-12-14 12:36:38

标签: file bash shell scripting line

如何获取目录中每个文件的第一行并将它们全部保存在新文件中?

#!/bin/bash

rm FIRSTLINE
for file in "$(find $1 -type f)";
do
head -1 $file >> FIRSTLINE
done
cat FIRSTLINE

这是我的bash脚本,但是当我这样做并打开文件FIRSTLINE时, 然后我看到了这个:

==> 'path of the file' <==
'first line' of the file

和我参数中的所有文件。

有人有解决方案吗?

4 个答案:

答案 0 :(得分:5)

find . -type f -exec head -1 \{\} \; > YOURFILE

可能适合你。

答案 1 :(得分:3)

问题是你引用了find的输出,所以它被视为一个字符串,所以for循环只运行一次,只有一个参数包含所有文件。这意味着您运行head -1 file1 file2 file3 file4 ...等,当给定多个文件head时,会打印==> file1 <==标题。

所以要修复它,删除find shell-out周围的双引号,这样可以确保按照预期为每个文件运行一次for循环。此外,在shell-out之后的分号是不必要的。

#!/bin/bash

rm FIRSTLINE
for file in $(find $1 -type f)
do
    head -1 $file >> FIRSTLINE
done
cat FIRSTLINE

这有一些样式问题,你真的需要写一个文件然后cat文件到stdout吗?您可以将输出打印到stdout:

#!/bin/bash

for file in $(find $1 -type f)
do
    head -1 $file
done

就我个人而言,我会这样写:

find $1 -type f | xargs -L1 head -1

或者如果你需要文件中的输出并打印到stdout:

find $1 -type f | xargs -L1 head -1 | tee FIRSTLINE

答案 2 :(得分:0)

$ for file in $(find $1 -type f); do echo ''; 
    echo $file; 
    head -n 4 $file; 
  done

答案 3 :(得分:0)

用于实例的gzip文件:

for file in `ls *.gz`; do gzcat $file | head -n 1; done > toto.txt