파일을 압축 및 복사하고 디렉토리 구조를 유지하는 방법은 무엇입니까?

파일을 압축 및 복사하고 디렉토리 구조를 유지하는 방법은 무엇입니까?

Linux에서 하나의 명령을 사용하여 파일을 압축하고 다른 폴더에 복사하고 디렉터리 구조를 유지하는 방법은 무엇입니까?

예를 들어 다음과 같습니다.

/dir1
/dir1/file1.fit
/dir1/file2.fit
/dir1/file3.fit
/dir1/dir2/file1.fit
/dir1/dir2/file2.fit
/dir1/dir2/file3.fit

명령을 사용한 후( /dir1에 복사한다고 가정 /another_dir) 다음을 얻고 싶습니다.

/another_dir/dir1
/another_dir/dir1/file1.fit.gz
/another_dir/dir1/file2.fit.gz
/another_dir/dir1/file3.fit.gz
/another_dir/dir1/dir2/file1.fit.gz
/another_dir/dir1/dir2/file2.fit.gz
/another_dir/dir1/dir2/file3.fit.gz

이것은 /another_dir실제로 또 다른 하드 드라이브입니다. 이 대상 드라이브에 공간이 충분하지 않기 때문에(데이터 2TB) 먼저 파일을 복사한 다음 모두 gzip으로 압축하도록 제안하지 마십시오(또는 그 반대로). 마찬가지로 gz 파일은 작업 후 원본 폴더에 남아 있어서는 안 됩니다.

답변1

압축을 위한 모든 디렉터리(귀하의 경우)가 포함된 루트 폴더에 있다고 가정하면 다음 과 같은 명령을 사용할 /수 있습니다 .findxargs

find dir1/ -name "*.fit" -print0 | xargs -i% -r0 sh -c 'mkdir -vp "$(dirname "/another_dir/%")" && gzip -vc "%" | tee "/another_dir/%".gz > /dev/null && rm -v "%"'

| tee "/another_dir/%".gz > /dev/null참고: 로 바꿀 수도 있습니다 > "/another_dir/%".gz.

.fit그러면 그 안에 있는 모든 파일을 찾아서 각 파일이 교체되는 구문 분석 명령 dir1/으로 전달됩니다 .xargs%

xargs명령은 다음을 수행합니다.

  • 빈 폴더( mkdir)를 생성하고 해당 폴더( -p)가 자리 표시자로 사용되지 않습니다.
  • 주어진 파일( %)을 표준 출력( -c)으로 압축하고 압축된 출력을 로 리디렉션합니다 tee.
  • tee.gz압축된 입력을 파일 에 저장합니다 ( tee입력은 기본적으로 터미널 화면에 인쇄되므로 으로 보내면 /dev/null억제되지만 내용은 여전히 ​​주어진 파일에 저장됩니다).

압축이 성공하면 원본( rm)을 삭제하세요. 압축 파일을 확인한 후 언제든지 이 섹션을 제거하여 압축 파일을 수동으로 삭제할 수 있습니다.

중요한 점은 상대 폴더에 있으므로 dir1/반환된 모든 경로가 find현재 폴더를 기준으로 하므로 따로 작업할 필요가 없다는 것입니다.절대 경로를 상대 경로로 변환realpath(예를 들어 를 통해 이 작업을 수행할 수 있지만 realpath --relative-to=$absolute $current위 명령이 너무 복잡해집니다.)

-rmacOS에서는 인수를 사용하려면 GNU ( ) xargs를 설치 하고 대신 명령을 사용해야 합니다. 다른 BSD 시스템과 유사합니다.xargsbrew install xargsgxargs

관련 질문:여러 디렉터리에 여러 파일을 gzip으로 압축하고 새 디렉터리에 복사.

답변2

이 작업을 수행할 수 있는 단일 명령은 없지만ServerFault에서동일한 기능을 수행하는 간단한 스크립트의 예입니다. 파일 권한이나 액세스/수정 시간은 유지되지 않으며 파일 이름에 공백 등이 포함되어 있으면 문제가 발생할 수 있습니다.

관련 정보