Shell

在管道中使用名稱中包含空格的文件

  • March 8, 2012

我有一個名為的文件夾play,其中包含一個文件damn file(帶空格)。當我使用find並將輸出傳輸到tar

find play/ -name 'damn*' | tar cf archive.tar -T -

它完美地工作。為什麼會這樣 的輸出find包含應該導致問題的空間tar。當我使用這個命令時:

tar cf archive.tar $(find play/ -name 'damn*')

bash 顯示以下錯誤:

tar: play/damn: Cannot stat: No such file or directory
tar: file: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

我糊塗了。為什麼第一個範例有效?

在第二個範例中,shell 刪除了換行符,shell 對命令替換的輸出進行了分詞。由於預設情況下包含換行符IFS,因此它們被視為欄位分隔符,而不是欄位本身的一部分。在第一個範例中,輸入來自管道而不是外殼,因此外殼無法進行分詞。

雙引號命令替換 ( "$(find ... )") 將防止發生分詞,但find內部命令替換幾乎總是一個主意,所以不要這樣做。為了最大程度的安全,無論何時您可以訪問 GNU 版本的 Unix 工具,您都應該使用空分隔符選項:

find dir/ -name '...' -print0 | tar cf foo.tar --null --no-recursion -T -

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