Ls

使用 ls 時文件名中的換行符是否仍然存在問題

  • October 13, 2018

如此處所述:

文件名中的換行符\n是一個問題,當管道輸出ls到另一個命令時,因為換行符會將一個文件名分成兩行。

手冊頁的ls狀態:

-b, --escape                print C-style escapes for nongraphic characters
-q, --hide-control-chars    print ? instead of nongraphic characters
-1                          list one file per line.  Avoid '\n' with -q or -b

所以我的解釋是,使用-bor-q選項可以解決這個問題。或者還有沒有被這種方法覆蓋的案例?

下一個命令將如何通過管道輸出來處理這些轉義?如何在目錄樹中找到更深的文件?是否可以在非 Linux 的 POSIX 上執行?GNU 版本的 ls 預設情況下會進行一些過濾,但這並不是在每個系統上都有。

David Wheeler 的文章Fixing Unix/Linux/POSIX Filenames: Control Characters (such as Newline), Leading Dashes, and Other Problems討論了一些問題。許多軟體都假設各種控製字元(如 \n 或 \t)可以用作分隔符,因此帶有這些字元的文件可能會出現問題。但是,有一些方法可以處理幾乎包含任何字元的文件名:

值得注意的是,如果您想處理完全任意的文件名,請使用“find . … -exec” 盡可能;這是 100% 可移植的,並且可以處理任意尷尬的文件名。find of -exec … {} + 的最新 POSIX 新增功能也可以提供幫助。所以在你可以的地方,做這樣的事情:

 # This is correct and portable; painful if "command" gets long:
 find . ... -exec command {} ;
 # This is correct and standard; some systems don't implement this:
 find . ... -exec command {} +

如果您可以阻止包含 \n 的文件,您可以使用設置 shell 輸入欄位分隔符的技巧,只說換行符和製表符。然後在 shell 腳本中使用文件名變數。

 IFS="`printf '\n\t'`"
 for file in `find . -type f` ; do
   some_command "$file" ...
 done

引用自:https://serverfault.com/questions/935276