Command-Line
迴聲 * |xargs -n1 echo ,是否有更短、更優雅的逐行列出方式?
當我這樣做時
ls
,輸出是在列中,但是我需要輸出只在一列中,逐行,每行一個條目。所以我能想出的唯一方法是:
echo * | xargs -n1 echo
這是實現它的標準方法還是這種糟糕的風格?
這很糟糕,出於所有原因,plain
xargs
很糟糕,即它與包含空格或反斜杠的文件名中斷:$ touch "foo bar" $ echo * | xargs -n1 echo foo bar
echo
此外,它為每個文件執行(外部)命令的副本。在大多數 shell 中,您可以使用它
printf "%s\n" *
來獲取列表。或ls -1
。但是,問題是,您想對文件列表做什麼?只是查看它們或在腳本中使用它們?對於後者,您最好使用
for f in * ; do something with "$f" ; done
或一些變體
find ... -exec somecmd {} +
關於 xargs 的一般建議是,不要使用
xargs
. 任何常用工具都不支持其輸入格式。xargs 使用的下一個級別是 use
xargs -0
,輸入是空分隔的。但是在您的情況下, xargs 無論如何都是毫無意義的。如果要列出目錄中的文件,可以使用
ls
. 要確保每行只有一個文件,請使用ls -1
. 該ls
命令在其輸出到管道或文件時總是每行放置一個文件。當輸出是終端時,plain會ls
在列中對齊文件名,但ls -1
不會。如果你有一個單詞列表並且你想每行列印一個,你可以使用
printf '%s\n'
. 這類似於echo
,除了它在每個元素之後列印一個換行符而不是一個空格,並且不存在反斜杠或初始破折號處理的危險。printf '%s\n' * # prints the names of the files in the current directory printf '%s\n' "$@" # prints the positional arguments printf '%s\n' "${a[@]}" # prints the element of the array `a`