글쎄, 나는 그것이 가능하다고 생각하지만 잘 이해가 되지 않습니다. 이것이 그 경우 다.
한 폴더에는 내 봇의 모든 프로세스에 대한 로그 파일이 포함되어 있습니다. 구조는 약간 다음과 같습니다.
$ ls -lrt
total 8
drwxrwxr-x 2 per per 4096 nov 3 12:46 launch01
-rw-rw-r-- 1 per per 0 nov 3 12:47 camera112.log
-rw-rw-r-- 1 per per 0 nov 3 12:47 motors121.log
-rw-rw-r-- 1 per per 0 nov 3 12:47 lidar111.log
drwxrwxr-x 2 per per 4096 nov 3 12:49 launch02
-rw-rw-r-- 1 per per 0 nov 3 12:49 motors122.log
-rw-rw-r-- 1 per per 0 nov 3 12:49 lidar211.log
-rw-rw-r-- 1 per per 0 nov 3 12:49 camera113.log
파일 camera112.log
과 로그는 폴더 motors121.log
와 연결됩니다 . 특정 부팅에 속하는 모든 파일을 가져와서 tarball로 패키징하는 스크립트를 작성하고 싶습니다. 타임스탬프는 파일마다 조금씩 다를 수 있고 파일의 숫자는 거의 관련이 없기 때문에 모든 관련 파일을 수집하는 가장 좋은 방법은 아래의 모든 파일(포함)을 다음 파일까지 가져오는 것이라고 생각했습니다. 목록의 디렉터리(제외) 타임스탬프 및 이름과 마찬가지로 파일 수도 다를 수 있습니다. 일관된 것은 폴더, 파일 묶음, 다음 폴더, 파일 등입니다. 궁극적으로 최신 로그 세트를 쉽게 얻고 싶습니다.lidar111.log
launch01
launch01
여기서 접근 방식이 확실하지 않습니다. 이 문제를 해결하는 방법에 대한 아이디어가 있습니까?
밝히다:
- 파일 수량은 다를 수 있습니다.
- 정확한 타임스탬프는 신뢰할 수 없지만(언급한 바와 같이 폴더
launch01
는 다릅니다camera112.log
) 상대 타임스탬프는 잘 작동합니다. 예를 들어, 제공된 목록의 (포함)부터 (포함하지 않음)까지 모든 파일을 패키지할 수 있다면launch01
좋을 것입니다 .launch02
ls -lrt
답변1
입력을 사용하여 작업을 덩어리로 나눕니다.
drwxrwxr-x 2 per per 4096 nov 3 12:46 launch01
-rw-rw-r-- 1 per per 0 nov 3 12:47 camera112.log
-rw-rw-r-- 1 per per 0 nov 3 12:47 motors121.log
-rw-rw-r-- 1 per per 0 nov 3 12:47 lidar111.log
drwxrwxr-x 2 per per 4096 nov 3 12:49 launch02
-rw-rw-r-- 1 per per 0 nov 3 12:49 motors122.log
-rw-rw-r-- 1 per per 0 nov 3 12:49 lidar211.log
-rw-rw-r-- 1 per per 0 nov 3 12:49 camera113.log
파일 이름의 "정렬된" 목록만 생성
다음 중 하나를 사용하십시오.
ls -lrt | tr -s ' ' | cut -d' ' -f9
ls -lrt | awk '{print $9}'
다음을 제공합니다:
launch01
camera112.log
motors121.log
lidar111.log
launch02
motors122.log
lidar211.log
camera113.log
목록을 여러 부분으로 나누기
이것을 수정하세요답변도착하다구분 기호를 기준으로 하나의 파일을 여러 파일로 분할awk_pattern
, 다음 내용으로 이름이 지정된 파일을 만듭니다 .
BEGIN{ fn = "part1.txt"; n = 1 }
{
if (substr($0,1,6) == "launch") {
close (fn)
n++
fn = "part" n ".txt"
}
print > fn
}
그런 다음 실행
ls -lrt | awk '{print $9}' | awk -f awk_pattern
원하는 출력을 제공합니다.
part1.txt
launch01
그런 다음
part2.txt
launch01
camera112.log
motors121.log
lidar111.log
part3.txt
launch02
motors122.log
lidar211.log
camera113.log
첫 번째 파일( part1.txt
)은 한 줄만 포함하므로 삭제해야 하지만...
rm part1.txt
tar의 각 부분의 내용
tar -c -v -z -T part2.txt -f part2.tgz
tar 파일을 반복합니다.
for part_file in $(ls part*)
do
tar_file = ${part_file%.*}
# tar_file = basename ${part_file} .txt
tar -c -v -z -T ${part_file} -f ${tar_file}.tgz
done
이것은 주어야 한다
part1.tgz
part2.tgz
part3.tgz
다시 한 번 part1.tgz
삭제해야 합니다.
rm part1.tgz
그것들을 하나로 합치다
#!/bin/bash
ls -lrt | awk '{print $9}' | awk -f awk_pattern
for part_file in $(ls part*)
do
tar_file = ${part_file%.*}
tar -c -v -z -T ${part_file} -f ${tar_file}.tgz
done
rm part1.txt
rm part1.tgz
스크립트로(awk 모드 포함)
#!/bin/bash
ls -lrt | awk '{print $9}' | awk 'BEGIN{ fn = "part1.txt"; n = 1 }
{
if (substr($0,1,6) == "launch") {
close (fn)
n++
fn = "part" n ".txt"
}
print > fn
}'
for part_file in $(ls part*)
do
tar_file = ${part_file%.*}
tar -c -v -z -T ${part_file} -f ${tar_file}.tgz
done
rm part1.txt
rm part1.tgz
이것은 (희망적으로)~해야 한다압축할 파일이 없었기 때문에 처음 두 단계, 즉 tar 부분까지만 테스트했지만 작동합니다.
가능한 개선 사항:
후처리:
part*.txt
파일 삭제(rm part*.txt
)후처리: 압축 후 로그 파일 삭제(
rm *.log
)후처리: 압축 후 디렉토리 삭제(
rm -R -- */
)이것 좀 봐답변도착하다디렉토리에서 모든 하위 디렉토리를 제거하는 방법은 무엇입니까?.
part1.txt
awk가 쓸모없는 파일을 생성하지 못하도록 방지tar 파일을 다른 곳에 저장하십시오(
... -f ${tar_path}/${tar_file}.tgz
).중간 파일을 사용하지 마십시오
part*.txt
.