echo * | xargs -n1 echo 1行ずつリストを作成するより短くてエレガントな方法はありますか?

echo * | xargs -n1 echo 1行ずつリストを作成するより短くてエレガントな方法はありますか?

これを行うと、ls出力は列に表示されますが、出力は1列、行単位、行ごとに1つの項目にのみ存在する必要があります。

だから私が考えることができる唯一の方法は次のとおりです。

echo * | xargs -n1 echo

これがそれを実装する標準的な方法ですか、それとも悪いスタイルですか?

答え1

xargsに関する一般的なアドバイスは、xargsを使用しないことですxargs。対応する入力形式は一般的なツールではサポートされていません。

xargs 使用法の次のレベルは use でxargs -0、ここで入力はヌルで区切られます。しかし、あなたの場合、xargsはとにかく意味がありません。

ls1行に1つのファイルしか持たないようにするには、を使用しますls -1lsこのコマンドは、出力がパイプまたはファイルに転送されると、常に1行に1つのファイルを配置します。 plainは、出力が端末に渡されると列のlsファイル名をソートしますが、ls -1そうではありません。

これは、単語リストがあり、1行に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`

答え2

これは一般的な悪いすべての理由で悪いことではありませんxargs。つまり、スペースやバックスラッシュを含むファイル名が破損します。

$ touch "foo bar"
$ echo * | xargs -n1 echo
foo
bar

echoまた、各ファイルに対して(外部)コマンドのコピーも実行します。

ほとんどのシェルでは、これを使用してprintf "%s\n" *リストを取得できます。またはls -1

しかし、問題はファイルリストで何をしますか?ただ見たり、スクリプトで使用したいですか?後者の場合、おそらく以下を使用する方が良いでしょう。

for f in * ; do something with "$f" ; done

またはいくつかの変形find ... -exec somecmd {} +

答え3

ファイル名に特殊文字が含まれている場合、目的の操作は実行されません。

$ touch 'name
with newline' 'other name\nwith newline'
$ echo * | xargs -n1 echo
name
with
newline
other
name
with
newline

ファイルを一覧表示したい場合にのみ使用できますls -1。それ以外の場合はフラグfindと一緒に使用してください。-exec

関連情報