TL; DR
find /my/dir/ -printf "%P\n" | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
ด้วยเงื่อนไขบางประการ (เก็บถาวรเฉพาะไฟล์ dirs และ symlink):
find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
คำอธิบาย
น่าเสียดายที่ด้านล่างมีไดเรกทอรีหลัก./
ในที่เก็บถาวร:
tar -czf mydir.tgz -C /my/dir .
คุณสามารถย้ายไฟล์ทั้งหมดออกจากไดเรกทอรีนั้นโดยใช้--transform
ตัวเลือกการกำหนดค่า แต่ไม่ได้กำจัด.
ไดเรกทอรีเอง มันยากที่จะเชื่อคำสั่งมากขึ้นเรื่อย ๆ
คุณสามารถใช้$(find ...)
เพื่อเพิ่มรายชื่อไฟล์ลงในคำสั่ง (เช่นในคำตอบแมกนัส ) แต่นั่นอาจทำให้เกิดข้อผิดพลาด "รายการไฟล์ยาวเกินไป" วิธีที่ดีที่สุดคือการรวมเข้ากับ-T
ตัวเลือกของ tar เช่นนี้
find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
โดยพื้นฐานแล้วสิ่งที่มันทำคือรายการไฟล์ทั้งหมด ( -type f
), ลิงค์ ( -type l
) และไดเรกทอรีย่อย ( -type d
) ภายใต้ไดเรกทอรีของคุณสร้างชื่อไฟล์ทั้งหมดที่เกี่ยวข้องโดยใช้-printf "%P\n"
แล้วส่งผ่านไปยังคำสั่ง tar (ใช้ชื่อไฟล์จาก STDIN โดยใช้-T -
) -C
ตัวเลือกที่เป็นสิ่งจำเป็นเพื่อให้ tar รู้ว่าไฟล์ที่มีชื่อญาติตั้งอยู่ การ--no-recursion
ตั้งค่าสถานะคือเพื่อที่ tar จะไม่ถูกเรียกคืนไปยังโฟลเดอร์ที่ถูกบอกให้เก็บถาวร (ทำให้ไฟล์ซ้ำกัน)
หากคุณต้องการทำสิ่งพิเศษกับชื่อไฟล์ (การกรอง, การเชื่อมโยงตามปกติเป็นต้น), find
คำสั่งมีประสิทธิภาพมากและคุณสามารถทดสอบได้โดยเพียงแค่ลบtar
ส่วนของคำสั่งด้านบน:
$ find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d
> textfile.txt
> documentation.pdf
> subfolder2
> subfolder
> subfolder/.gitignore
ตัวอย่างเช่นหากคุณต้องการกรองไฟล์ PDF ให้เพิ่ม ! -name '*.pdf'
$ find /my/dir/ -printf "%P\n" -type f ! -name '*.pdf' -o -type l -o -type d
> textfile.txt
> subfolder2
> subfolder
> subfolder/.gitignore
ไม่ใช่ GNU
คำสั่งใช้printf
(มีใน GNU find
) ซึ่งบอกfind
ให้พิมพ์ผลลัพธ์ด้วยพา ธ สัมพัทธ์ อย่างไรก็ตามหากคุณไม่มี GNU find
สิ่งนี้จะทำให้เส้นทางสัมพันธ์ (ลบผู้ปกครองด้วย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
? ในกรณีของฉันมันเป็นเพียงการจัดเก็บไฟล์และไม่ใช่ไดเรกทอรี เมื่อฉันแค่tar
ไดเรกทอรีมันรวม แต่มีtar -czf
เพียงการเพิ่มไฟล์