
ip_DBfiles.txtにリストされているログファイル名に関連するファイルサイズとサーバーからログファイル名を取得しようとしています。ファイルサイズとファイル名が一致する場合は、3番目のファイルop_DBfiles.txtに書き込む必要があります。
1.ip_DBファイル.txt
Date Logfilename
01/06/2021 /server/base/a.log
02/06/2021 /server1/base1/b.log
2.cdを/server/lgsに
db_listfiles="$(cat ${ip_DBfiles} |awk '{print $3}')"
for i in "${db_listfiles[@]}"
do
find . -type f -print|egrep "(${i})" > /dev/null 2>&1
if [ $? -eq 1 ] ;
then
echo "no action"
else
echo
find . -type f -print|egrep "(${i})" -exec du -ah {} \; > filesize.txt
fi
done
- op_DBファイル.txt
Number Date Logfilename size
1 01/06/2021 /server/base/a.log 5
2 02/06/2021 /server1/base1/b.log 6
statを使用すると、次のエラーメッセージが表示されます。
stat: cannot stat `/server/base/a.log\n/server1/base1/b.log': No such file or directory
ファイルが存在するが find コマンドを使用すると、filesize.txt に空のファイルが生成されます。
助けてくれてありがとう!
答え1
Linuxを実行しているため、出力フォーマットにstat
非常に便利なオプションがあるGNUバージョン(GNU coreutilsパッケージにあります)を使用できます。まったくループする必要はありません--printf
。for
"${db_files[@]}"
配列にファイル名のフルパス(または少なくとも現在のディレクトリに相対的なパス名)が含まれていると仮定すると、同様のコマンドを実行してファイルサイズ(バイト)と名前を取得できます。
stat --printf "%s\t%n\n" "${db_files[@]}"
これにより、ファイルサイズ、タブ、ファイル名が印刷され、次に印刷されますdb_files
。
「人が読める」形式のサイズが必要な場合は、numfmt
次のように形式を再指定できます(GNU coreutilsでも使用可能)。
stat --printf "%s\t%n\n" "${db_files[@]}" | numfmt --to=si
例えば
$ stat --printf "%s\t%n\n" ./file*.txt
12942 ./file1.txt
71529 ./file2.txt
83135 ./file3.txt
12889 ./file4.txt
$ stat --printf "%s\t%n\n" ./file*.txt | numfmt --to=si
13K ./file1.txt
72K ./file2.txt
84K ./file3.txt
13K ./file4.txt
しかし、ループを使用するには、次のようにします。
for f in "${db_files[@]}"; do
if [ -f "$f" ] ; then
stat --printf "%s\t%n\n" "$f" | numfmt --to=si >> "$b_file"
else
echo "$f" >> "$a_file"
fi
done