tar: 중간 디렉터리를 제외하고 리프 디렉터리를 포함하는 방법은 무엇입니까?

tar: 중간 디렉터리를 제외하고 리프 디렉터리를 포함하는 방법은 무엇입니까?

.tar 파일로 추출하기에 적합한 tar 파일을 만들고 싶습니다 /. 파일 시스템의 루트를 나타내고 아래의 tar에 포함하려는 모든 항목(예: ) etc/rc.d/init.d/glassfish3opt/glassfish3/...기타 디렉터리 및 파일을 포함하는 작업 디렉터리를 만들었습니다 opt/....

이렇게 하면 tar 파일에 tar zcvpf files.tgz *중간 디렉터리(예 etc: , 및 )가 포함됩니다 etc/rc.d. opt그런 다음 다른 시스템으로 추출하면 /제대로 작동하지 않아 해당 디렉토리의 소유권과 권한이 손상됩니다. 나는 정말로 그들을 내버려두고 만지지 않고 싶었습니다.

그래서 저는 이 문제에 대한 좋은 해결책을 찾았다고 생각합니다.

find . -type f -print0 | tar zcvpf files.tgz --null --files-from -

파일만 포함하는 tar를 생성합니다. 이것은 굉장합니다. 내가 넣은 파일만 가져옵니다... 다만 다음과 같은 중요한 리프 디렉터리는 가져오지 않는다는 것을 발견했습니다.

opt/glassfish3/glassfish/lib/asadmin

이것은 빈 디렉토리입니다(Glassfish3에서는 이를 요구하며, 그렇지 않으면 불평할 것입니다).

중간 디렉터리는 건너뛰고 최종 디렉터리는 건너뛰지 않는 tar 파일을 만드는 방법은 무엇입니까?find+awk 마법이 도움이 될 것 같은 느낌이 듭니다. 그러나 한 줄씩 작성할 필요는 없으며 가독성이 중요합니다. 감사해요.


편집하다: 나는 이것을 찾았다. 기타/더 나은 아이디어 환영:

cat <(find . -type f -print0) <(find . -type d -empty -print0) | tar zcvpf files.tgz --null --files-from -

답변1

find'OR'이 가능하므로 -o다음과 같이 두 명령을 결합할 수 있습니다.find

find . \( -type f -o -type d -empty \) -print0 | tar ...

또는 모든 파일을 하나의 명령줄에 배치할 수 있다고 보장할 수 있는 경우

find . \( -type f -o -type d -empty \) -exec tar cvfz files.tgz {} +

관련 정보