수정된 날짜를 기반으로 한 다소 복잡한 tar

수정된 날짜를 기반으로 한 다소 복잡한 tar

글쎄, 나는 그것이 가능하다고 생각하지만 잘 이해가 되지 않습니다. 이것이 그 경우 다.

한 폴더에는 내 봇의 모든 프로세스에 대한 로그 파일이 포함되어 있습니다. 구조는 약간 다음과 같습니다.

$ 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.loglaunch01launch01

여기서 접근 방식이 확실하지 않습니다. 이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

밝히다:

  • 파일 수량은 다를 수 있습니다.
  • 정확한 타임스탬프는 신뢰할 수 없지만(언급한 바와 같이 폴더 launch01는 다릅니다 camera112.log) 상대 타임스탬프는 잘 작동합니다. 예를 들어, 제공된 목록의 (포함)부터 (포함하지 않음)까지 모든 파일을 패키지할 수 있다면 launch01 좋을 것입니다 .launch02ls -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의 각 부분의 내용

~에서6.3 파일에서 이름 읽기

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 부분까지만 테스트했지만 작동합니다.


가능한 개선 사항:

  1. 후처리: part*.txt파일 삭제( rm part*.txt)

  2. 후처리: 압축 후 로그 파일 삭제( rm *.log)

  3. 후처리: 압축 후 디렉토리 삭제( rm -R -- */)

    이것 좀 봐답변도착하다디렉토리에서 모든 하위 디렉토리를 제거하는 방법은 무엇입니까?.

  4. part1.txtawk가 쓸모없는 파일을 생성하지 못하도록 방지

  5. tar 파일을 다른 곳에 저장하십시오( ... -f ${tar_path}/${tar_file}.tgz).

  6. 중간 파일을 사용하지 마십시오 part*.txt.

관련 정보