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
압축을 위한 모든 디렉터리(귀하의 경우)가 포함된 루트 폴더에 있다고 가정하면 다음 과 같은 명령을 사용할 /
수 있습니다 .find
xargs
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
위 명령이 너무 복잡해집니다.)
-r
macOS에서는 인수를 사용하려면 GNU ( ) xargs
를 설치 하고 대신 명령을 사용해야 합니다. 다른 BSD 시스템과 유사합니다.xargs
brew install xargs
gxargs
답변2
이 작업을 수행할 수 있는 단일 명령은 없지만ServerFault에서동일한 기능을 수행하는 간단한 스크립트의 예입니다. 파일 권한이나 액세스/수정 시간은 유지되지 않으며 파일 이름에 공백 등이 포함되어 있으면 문제가 발생할 수 있습니다.