다음과 같은 폴더 구조가 있습니다.
/foo
/foo/bar
/foo/bar2
/foo/bar3
모든 폴더(포함 /foo
)에는 이름이 .txt
. 그러나 이러한 파일을 제외 /foo
하고 /foo/bar /foo/bar2 등에 파일을 포함하고 싶습니다 .
그러나 이렇게 하면:
tar cvfz foo.tgz --exclude="/foo/*.txt" /foo
.txt
. 뿐만 아니라 전체 계층 구조의 모든 파일이 누락되었습니다 /foo
.
누구든지 이것을 달성하는 방법을 알고 있습니까?
답변1
--exclude
glob 스타일 패턴만 허용하는 것처럼 보이기 때문에 tar만 사용하여 이 작업을 수행할 수 있는지 확실하지 않습니다 . 그러나 find를 사용하여 파일 목록을 얻은 다음 정규 표현식을 사용하는 grep을 사용하여 해당 파일을 필터링할 수 있습니다.
find foo -type f -print0 | grep -z -v '^foo/[^/]*.txt$' | tar cvf foo.tgz --null -T -
옵션 -print0
및 -z
는 --null
해당 명령이 레코드(파일 이름)를 구분하기 위해 줄 바꿈 대신 널 바이트를 사용함을 나타냅니다. 일부 파일에는 예기치 않은 문자가 포함될 수 있으므로 이는 좋은 습관입니다.