วิธีไม่รวมไดเรกทอรีหลักเมื่อใช้คำสั่ง zip?


1

ฉันจำเป็นต้อง:

  1. สำรวจไดเรกทอรีและค้นหาโฟลเดอร์ย่อยทั้งหมดที่สร้างขึ้นสำหรับ> X days ago
  2. บีบอัดเนื้อหาของโฟลเดอร์เหล่านี้ภายในโฟลเดอร์ย่อยและลบเนื้อหาก่อนหน้า

ตัวอย่างไฟล์ strucutre ตั้งแต่ต้น:

root_folder:
    sub-dir (many of these):
        sub-sub-dir (many of these):
            content1 (can be file or folder)
            content2 (can be file or folder)
            content3 (can be file or folder)

ตัวอย่างไฟล์ strucutre หลังจากคำสั่งเสร็จสิ้น:

root_folder:
    sub-dir:
        sub-sub-dir:
            zipfile.zip

แต่! ฉันไม่ต้องการรวมโครงสร้างโฟลเดอร์ทั้งหมด (sub-dir / sub-sub-dir) ในไฟล์ zip ฉันต้องการให้ไฟล์ zip มีลักษณะดังนี้:

zip_file:
    content1 (no matter if it is a file or a folder with content in it)
    content2 (no matter if it is a file or a folder with content in it)
    content3 (no matter if it is a file or a folder with content in it)

แทน:

zip_file:
    sub-dir:
        sub-sub-dir:
            content1
            content2
            content3

คำสั่งที่ฉันใช้ไปไกลจะแก้ปัญหาทุกอย่างได้ แต่ส่วนโครงสร้างโฟลเดอร์ ... ดูเหมือนว่านี่ (ฉันไม่มีคำสั่งที่ถูกต้องต่อหน้าฉันตอนนี้ฉันอาจจะอัพเดทพรุ่งนี้

find * -mindepth X -maxdepth X -mtime +10 -exec zip -r -m \{}/zipfilename {} \;

คำตอบ:


0

ฉันคิดว่าคุณต้องการที่จะใช้แทน-execdir-exec

จาก manpage:

   -execdir command ;

   -execdir command {} +
          Like -exec, but the specified command is run from the  subdirec‐
          tory  containing  the  matched  file,  which is not normally the
          directory in which you started find.  This a  much  more  secure
          method  for invoking commands, as it avoids race conditions dur‐
          ing resolution of the paths to the matched files.  As  with  the
          -exec action, the `+' form of -execdir will build a command line
          to process more than one matched file, but any given  invocation
          of command will only list files that exist in the same subdirec‐
          tory.  If you use this option, you must ensure that  your  $PATH
          environment  variable  does  not  reference  `.';  otherwise, an
          attacker can run any commands they like by leaving an  appropri‐
          ately-named  file in a directory in which you will run -execdir.
          The same applies to having entries in $PATH which are  empty  or
          which  are  not absolute directory names.  If find encounters an
          error, this can sometimes cause an immediate exit, so some pend‐
          ing  commands  may  not  be run at all. The result of the action
          depends on whether the  +  or  the  ;  variant  is  being  used;
          -execdir  command  {} + always returns true, while -execdir com‐
          mand {} ; returns true only if command returns 0.

ตัวอย่างเช่น:

$ find sub-dir 
sub-dir
sub-dir/sub-sub-dir
sub-dir/sub-sub-dir/content3
sub-dir/sub-sub-dir/content1
sub-dir/sub-sub-dir/content1/file
sub-dir/sub-sub-dir/content2

$ find sub-dir/ -mindepth 2 -maxdepth 2 -type d -execdir zip -r -m {}/zipped {} \;  

...

$ unzip -l sub-dir/sub-sub-dir/content1/zipped.zip                                
Archive:  sub-dir/sub-sub-dir/content1/zipped.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2017-05-17 17:23   content1/
        4  2017-05-17 17:23   content1/file
---------                     -------
        4                     2 files

แน่นอนถ้าคุณไม่ต้องการเส้นทางใด ๆในไฟล์ zip ของคุณคุณสามารถผ่าน-j(หรือ--junk-paths) เพื่อเก็บไฟล์ได้


ขอบคุณมาก ๆ ! execdir เป็นสิ่งที่ฉันต้องการอย่างแน่นอน ตอนนี้เหลือปัญหาเล็กน้อยเพียง 1 รายการ ... :) ถ้าฉันต้องการตั้งชื่อไฟล์ซิปให้เป็นแบบไดนามิกมากขึ้นเช่น: sub-dir_sub-sub-dir.zip เป็นไปได้ไหม? อีกที; ขอบคุณมากสำหรับความช่วยเหลือ! นั่นช่วยฉันได้สักพัก
John Doe

นั่นเริ่มซับซ้อนขึ้น :) ฉันคิดว่ากุญแจสำคัญคือต้องส่งสคริปต์ด้วย-execdirแทนที่จะเป็นคำสั่ง การวางไข่กระสุนใหม่คุณจะสามารถตรวจสอบ$PWDและจัดการกับมันได้ ตัวอย่างเช่น-execdir bash -c 'zipname=${PWD//\//-}; zip -r $zipname ...'(แม้ว่า IMO จะสะอาดกว่าการสร้างสคริปต์มากกว่าการใช้งานจริงbash -c)
Possum
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.