Ls
使用 ls 時文件名中的換行符是否仍然存在問題
如此處所述:
文件名中的換行符
\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
所以我的解釋是,使用
-b
or-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