1

ディレクトリ内のすべてのファイルの最初の行を取得し、それらすべてを新しいファイルに保存するにはどうすればよいですか?

#!/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

4 に答える 4

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

あなたのために働くかもしれません。

于 2012-12-14T12:39:09.173 に答える
3

問題は、出力を引用したfindため、単一の文字列として扱われるため、forすべてのファイルを含む単一の引数でループが 1 回だけ実行されることです。つまり、実行head -1 file1 file2 file3 file4 ...などを意味し、複数のファイルが指定されたときにヘッダーをhead出力します。==> file1 <==

したがって、これを修正するには、シェルアウトを囲む二重引用符を削除します。これにより、意図したとおりに、ファイルごとに 1 回ループfindを実行できるようになります。forまた、シェルアウト後のセミコロンは不要です。

#!/bin/bash

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

ただし、これにはいくつかのスタイルの問題があります。本当にファイルに書き込み、次にcatファイルを標準出力に書き込む必要がありますか? 出力を標準出力に出力するだけです。

#!/bin/bash

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

個人的には以下のように書きます。

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

または、出力をファイルに出力して標準出力に出力する必要がある場合:

find $1 -type f | xargs -L1 head -1 | tee FIRSTLINE
于 2012-12-14T12:53:04.177 に答える
0
$ for file in $(find $1 -type f); do echo ''; 
    echo $file; 
    head -n 4 $file; 
  done
于 2015-08-19T19:20:36.360 に答える