これを行うと、ls
出力は列に表示されますが、出力は1列、行単位、行ごとに1つの項目にのみ存在する必要があります。
だから私が考えることができる唯一の方法は次のとおりです。
echo * | xargs -n1 echo
これがそれを実装する標準的な方法ですか、それとも悪いスタイルですか?
答え1
xargsに関する一般的なアドバイスは、xargsを使用しないことですxargs
。対応する入力形式は一般的なツールではサポートされていません。
xargs 使用法の次のレベルは use でxargs -0
、ここで入力はヌルで区切られます。しかし、あなたの場合、xargsはとにかく意味がありません。
ls
1行に1つのファイルしか持たないようにするには、を使用しますls -1
。ls
このコマンドは、出力がパイプまたはファイルに転送されると、常に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