find コマンドは Linux で空のファイルを生成します。

find コマンドは Linux で空のファイルを生成します。

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
  1. 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パッケージにあります)を使用できます。まったくループする必要はありません--printffor

"${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

おすすめ記事