Command-Line

迴聲 * |xargs -n1 echo ,是否有更短、更優雅的逐行列出方式?

  • August 23, 2018

當我這樣做時ls,輸出是在列中,但是我需要輸出只在一列中,逐行,每行一個條目。

所以我能想出的唯一方法是:

echo * | xargs -n1 echo

這是實現它的標準方法還是這種糟糕的風格?

這很糟糕,出於所有原因,plainxargs很糟糕,即它與包含空格或反斜杠的文件名中斷:

$ 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`

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