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เพียงการเพิ่มไฟล์