最上位ディレクトリの2つのサブディレクトリにいくつかの.csvログファイルがあり、各ディレクトリ内のすべての.csvログファイルを空にしますが、ヘッダーを維持してそのファイルを作成したアプリケーションがファイルを再入力できるようにします。
これを使用してファイルを空にすることができますが、for file in /path/to/file/*; do > $file;done
ヘッダも削除されます!
答え1
tmpfile=$( mktemp )
for pathname in /path/to/dir/*.csv; do
head -n 1 "$pathname" >"$tmpfile"
cat "$tmpfile >"$pathname"
done
rm "$tmpfile"
つまり、head -n 1
一時ファイルを使用してヘッダーを抽出し(最初の行であると仮定)、元のファイルを切り取り、一時ファイルからヘッダーを挿入します。
ヘッダーがすべてのファイルでまったく同じ場合:
tmpfile=$( mktemp )
set -- /path/to/dir/*.csv
head -n 1 "$1" >"$tmpfile"
for pathname do
cat "$tmpfile" >"$pathname"
done
rm "$tmpfile"
まず、位置パラメータを目的のファイルのリストに設定し、最初のファイルからヘッダーを抽出します。このループは位置パラメータ(CSVファイル)を繰り返し、各パラメータを切り取り、タイトルを挿入します。
上記の2つの例では、パターンが一致すると仮定/path/to/dir/*.csv
します。みんな影響を受けるファイル。実際のパターンの実際の例は次のとおりです。
/var/log/myprogram/dir1/*.csv /var/log/myprogram/dir2/*.csv
または中かっこ拡張をサポートするシェルを使用している場合:
/var/log/myprogram/{dir1,dir2}/*.csv
答え2
または、オプションをsed
提供したい場合に置き換えることもできます。ここで保持したいヘッダー行の数は次のとおりです。一部の実装では、明示的に空のバックアップファイルが必要になる場合があります。--in-place
-i
> "$file"
sed -i 4q "$file"
4
-i ''
ファイル数が大きすぎない場合は、ループを避けてファイルのリストを直接渡すことができます。
sed -si 4q subdir1/*.csv subdir2/*.csv
(暗示されているs
ように、少なくともGNU sedでは重複する可能性があります)-i
-s
または使用find
find path/to/dir -name '*.csv' -execdir sed -si 4q {} +