Tar

僅 tar 文件,無目錄

  • December 28, 2019

我可能可以編寫一個 shell 腳本來僅查找文件,然後將列表傳遞給 tar,但我想知道 tar 中是否已經有一個內置功能允許在單個命令行中執行此操作?

例如,我找到了--no-recursion開關,但是當我這樣做時:

tar --no-recursion -cvf mydir.tar mydir

它只歸檔目錄中條目的名稱(包括子目錄!),但不歸檔任何文件。

我也試過:

tar --no-recursion -cvf mydir.tar mydir/*

但是,雖然它只歸檔文件,但它也會歸檔子目錄的名稱

有沒有辦法只告訴 tar 文件,沒有目錄?

正如 camh 所指出的,前一個命令有一個小問題,即給定太多文件名,它會執行多次,隨後的呼叫會默默地清除之前的執行。由於我們也沒有壓縮,我們可以追加而不是覆蓋:

find mydir -maxdepth 1 -type f -print0 | xargs -0 tar Avf mydir.tar
find mydir -maxdepth 1 -type f -exec tar Avf mydir.tar {} +

Iocnarz對使用tar’s--null-Toptions 的回答也有效。如果您已cpio安裝,camh使用它的答案也很好。如果您有zsh並且不介意將它用於命令,Gilles 使用 zsh glob ( *(.)) 的答案似乎是最直接的。


關鍵是-maxdepth選項。最終答案,適當處理空格:

find mydir -maxdepth 1 -type f -print0 | xargs -0 tar cvf mydir.tar

這也應該有效:

find mydir -maxdepth 1 -type f -exec tar cvf mydir.tar {} +

當你想使用findwithtar時,最好的方法是使用cpio而不是tarcpio可以編寫 tar 存檔,旨在從標準輸入獲取要存檔的文件列表。

find mydir -maxdepth 1 -type f -print0 | cpio -o -H ustar -0 > mydir.tar

使用findandcpio是一種更加 unix-y 的方法,因為您find可以使用它擁有的所有功能進行文件選擇,然後cpio進行歸檔。值得學習這種簡單的用法cpio,因為您會發現很容易解決您在嘗試時遇到的問題tar

引用自:https://unix.stackexchange.com/questions/24870