나는 이 bash 스크립트를 실행하여 오늘 다음 형식의 모든 파일을 동일한 폴더에 넣습니다. 예를 들어, 여기 2012-12-17_083213
내 폴더가 되고 싶은데 그 안에는 .log
이 .log_stats
이름이 들어 있습니다.
하지만 스크립트가 작동하도록 할 수는 없습니다. 예를 들어, 그때까지 모든 것을 시도하면 dir=$(echo $i | awk '{split($1,a,"_"); print a[1]}');
테스트하기 위해 echo $dir 을 수행하고 다음과 같이 표시됩니다.
fwui.log
데이터베이스의 잠금에 대해 검색하고 이해했는데 어떻게 해결합니까?
스크립트는 다음과 같습니다.
#!/bin/bash
tosend=""
for i in *.log; do
dir=$(echo $i | awk '{split($1,a,"_"); print a[1]}');
if [ ! -d $dir ]; then
mkdir $dir;
fi;
cp $i $dir;
tosend="$tosend\n$dir"
done
for i in $(echo -e $tosend | uniq);do
echo Compressing $i
tar -zcvf $i.tar.gz $i
scp $i.tar.gz user@server
done
파일 형식은 다음과 같습니다.
2012-12-17_083213_1.log
2012-12-17_083213_1.log_stats
2012-12-17_083213_1.logaccount_ptr
2012-12-17_083213_1.loginitial_ptr
2012-12-17_083213_1.logptr
2012-12-17_093049_2.log
2012-12-17_093049_2.log_stats
2012-12-17_093049_2.logaccount_ptr
2012-12-17_093049_2.loginitial_ptr
2012-12-17_093049_2.logptr
답변1
먼저 awk의 첫 번째 줄을 다음과 같이 변경합니다.
dir="$(echo "$i" | awk '{split($0,a,"_"); printf "%s_%s",a[1],a[2]}')"
이렇게 하면 공백이 포함되어 있어도 계속 작동합니다.
그런 다음 "for i in" 줄을 다음으로 바꿉니다.
echo -e "$tosend" | grep -v '^$' | sort | uniq | while IFS= read i ;do
그리고 관련 장소에 ""를 추가하세요.
#!/bin/bash
tosend=""
for i in 20*.log*; do
dir="$(echo "$i" | awk '{split($1,a,"_"); printf "%s_%s",a[1],a[2]}')";
if [ ! -d "$dir" ]; then
mkdir "$dir" || { echo "ERROR during: mkdir '$dir'" ; exit 1 ; };
fi;
cp "$i" "$dir" || { echo "ERROR during: cp '$i' '$dir'" ; exit 2 ; };
tosend="${tosend}\n${dir}"
done
echo -e "$tosend" | grep -v '^$' | sort | uniq| while IFS= read i ;do
echo "Compressing $i"
echo REMOVE THIS ECHO ONCE TESTED tar -zcvf "${i}.tar.gz" "$i" \
&& { echo REMOVE THIS ECHO ONCE TESTED scp "${i}.tar.gz" user@server:/tmp/somedir/ \
|| { echo "ERROR during: scp '${i}.tar.gz' user@server:/tmp/somedir/" ; exit 4 ; };
}
|| { echo "ERROR during: tar -zcvf '${i}.tar.gz' '$i'" ; exit 3 ; };
done
일부 디스플레이를 저장하려면 tar에서 "v" 부분을 제거해야 할 수도 있습니다(작동한다는 것을 알고 나면).
위의 작업을 수행하는 또 다른 방법:
내 것을 교체하다
for i in 20*.log*; do
그리고:
ls -1d *|grep '^[0-9]*-[0-9]*-[0-9]*_[0-9]*_[0-9]*\.log.*'| while IFS= read i ; do
또는 grep을 단순화합니다.
ls -1d *|grep '^[0-9_-]*\.log' | while IFS= read i ; do
이 정도면 충분합니다(그러나 "./-_-1234.log.hahaha" 파일과 일치할 수 있습니다...).
답변2
로 시작해야 합니다 for i in *.log*; do
. for i in *.log; do
그렇지 않으면 다음과 같은 파일을 얻게 됩니다.마치다존재하다 .log
. 더 간단하게 다시 작성할 수 있다는 것 외에는 스크립트에 다른 문제가 없습니다.