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 패키지에 있음) 을 사용할 수 있습니다. 전혀 루프할 필요가 없습니다 --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

관련 정보