
我正在嘗試建立一個 bash 單行程式來循環當前目錄中的目錄,並將內容打包到唯一的 tar 中,使用目錄名稱作為 tar 檔名。我已經完成了基礎工作(查找目錄名稱,並用這些名稱來壓縮它們),但是我的循環拋出了一些錯誤訊息,我無法理解它在哪裡獲取嘗試運行的命令。
這是最有效的一行:
for f in `ls -d */`; do `tar -czvvf ${f%/}.tar.gz $f`;done
「奇怪」的輸出是:
-bash: drwxrwxr-x: command not found
-bash: drwxr-xr-x: command not found
-bash: drwxr-xr-x: command not found
-bash: drwxrwxr-x: command not found
我正在運行的命令的哪一部分我不理解並且正在生成該輸出?
答案1
您需要刪除tar
命令周圍的反引號。您可能還想透過管道傳輸ls
以xargs
確保 bash 正確獲取所有目錄:
for f in `ls -d */ | xargs`; do tar -cvzf ${f%/}.tar.gz $f; done
反引號捕獲輸出tar
並嘗試在循環的每次迭代中將其作為命令執行。當您使用 -v 選項時,首先tar
列印的是每個檔案的權限(例如drwxrwxr-x
)。在這種情況下,您希望 bash執行tar 指令,不捕獲輸出。
答案2
比傑勞布關於周圍的反引號是正確的tar
,但是您不需要使用ls
:
for file in */
會成功並正確處理帶有空格的目錄名稱。
答案3
這裡的其他答案都很好,但我想添加另一個選項,以防您只需要獲取目錄而不是符號鏈接等:
for f in `find -maxdepth 1 -type d` | do -cvzf ${f%/}.tar.gz $f; done
希望這可以幫助!