2017-01-19 56 views
2

想象一下,一個文件夾結構是這樣的:特殊用途的Linux一起find命令拉鍊

  • /411 /文件夾1/
  • /411 /存檔/
  • /211 /存檔/
  • /211 /文件夾1/
  • /211 /文件夾2/

在每個子文件夾會有文件和更subfolde rs與文件/文件夾。我有興趣壓縮名爲'archive'的子文件夾中的所有文件,並忽略結構中的所有其他文件夾。

如果我使用命令:find * -type d -name 'archive'

輸出將是這樣的:

  • 928 /歸檔
  • 973 /歸檔
  • 990 /歸檔

我我感興趣的是有這樣一個輸出:

  • 928 /存檔/ file1.jpg
  • 928 /存檔/ file2.jpg
  • 928 /存檔/文件夾1/file3.jpg

等等,這樣我可以使用司令: find * -type d -name 'archive' [with some more/other options] | zip all_archive_files.zip [email protected]

這怎麼辦?

+0

只是爲了澄清,你想要一個帶有所有檔案內容的zip文件? –

回答

1

這是粗糙的,但你可以:

find . -type d -name 'archive' -exec find {} \; | zip stuff.zip [email protected] 
+0

使用(並不少見)警告:在其中有換行符的文件名不起作用。 – trentcl

+0

警告 - 好的,但爲什麼*並不少見*?在大約40年的編程中,我不記得遇到過一個案例,一個偶然的人會創建一個帶有嵌入換行符的文件名。當然,這*可能會發生,並且應該意識到這種可能性,但我認爲這是非常罕見的情況。 – user1934428

+0

我說這個警告本身很常見,而不是文件名中帶有換行符。換句話說,寫出這樣明顯但錯誤的腳本是非常常見的。 – trentcl

1

運行zip正常的方式取文件名的命令行,並與-r標誌該命令將通過自身遞歸到目錄。考慮

find . -name 'archive' -type d -exec zip -r all_archive_files.zip {} + 

-exec選項將運行zip -r all_archive_files.zip ...其中...find找到了所有文件的清單取代。與echo-execzip之間運行它,看看它會做:

$ find . -name 'archive' -type d 
411/archive 
412/archive 
488/archive 
512/archive 
$ find . -name 'archive' -type d -exec echo zip -r all_archive_files.zip {} + 
zip -r all_archive_files.zip 411/archive 412/archive 488/archive 512/archive 
2

可以搭配使用-pathregex整個路徑上:例如

find . -regex './[0-9]+/archive/.*' -type f -exec zip all.zip {} \;