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