bash 單行迴圈遍歷目錄會引發錯誤

bash 單行迴圈遍歷目錄會引發錯誤

我正在嘗試建立一個 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命令周圍的反引號。您可能還想透過管道傳輸lsxargs確保 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 

希望這可以幫助!

相關內容