TL; DR
find /my/dir/ -printf "%P\n" | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
Với một số điều kiện (chỉ lưu trữ tệp, thư mục và liên kết tượng trưng):
find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
Giải trình
Không may dưới đây bao gồm một thư mục cha ./
trong kho lưu trữ:
tar -czf mydir.tgz -C /my/dir .
Bạn có thể di chuyển tất cả các tệp ra khỏi thư mục đó bằng cách sử dụng --transform
tùy chọn cấu hình, nhưng điều đó không thoát khỏi .
chính thư mục đó. Nó trở nên ngày càng khó khăn để chế ngự lệnh.
Bạn có thể sử dụng $(find ...)
để thêm danh sách tệp vào lệnh (như trong câu trả lời của Magnus ), nhưng điều đó có khả năng gây ra lỗi "danh sách tệp quá dài". Cách tốt nhất là kết hợp nó với -T
tùy chọn của tar , như thế này:
find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
Về cơ bản những gì nó làm là liệt kê tất cả các tệp ( -type f
), links ( -type l
) và thư mục con ( -type d
) trong thư mục của bạn, tạo tất cả tên tệp tương đối bằng cách sử dụng -printf "%P\n"
, sau đó chuyển nó sang lệnh tar (nó lấy tên tệp từ STDIN bằng cách sử dụng -T -
). Các -C
tùy chọn là cần thiết để tar biết nơi các tập tin với những cái tên tương đối được đặt. Các --no-recursion
lá cờ rất tar mà không recurse vào thư mục nó được nói đến lưu trữ (gây file trùng lặp).
Nếu bạn cần làm một cái gì đó đặc biệt với tên tệp (lọc, theo các liên kết tượng trưng, v.v.), find
lệnh này khá mạnh mẽ và bạn có thể kiểm tra nó bằng cách chỉ cần loại bỏ tar
một phần của lệnh trên:
$ find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d
> textfile.txt
> documentation.pdf
> subfolder2
> subfolder
> subfolder/.gitignore
Ví dụ: nếu bạn muốn lọc các tệp PDF, hãy thêm ! -name '*.pdf'
$ find /my/dir/ -printf "%P\n" -type f ! -name '*.pdf' -o -type l -o -type d
> textfile.txt
> subfolder2
> subfolder
> subfolder/.gitignore
Không tìm thấy GNU
Lệnh sử dụng printf
(có sẵn trong GNU find
) find
để in kết quả của nó với các đường dẫn tương đối. Tuy nhiên, nếu bạn không có GNU find
, điều này hoạt động để làm cho các đường dẫn tương đối (loại bỏ cha mẹ với sed
):
find /my/dir/ -type f -o -type l -o -type d | sed s,^/my/dir/,, | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
tar -czf
? Trong trường hợp của tôi, nó chỉ lưu trữ các tập tin và không lưu trữ thư mục. Khi tôi chỉtar
thư mục bao gồm nó nhưng vớitar -czf
nó chỉ là thêm các tập tin.