
1行にファイル/ディレクトリのリストを印刷するにはecho
?
スペースを改行文字に置き換えることができますが、ファイル名にスペースが含まれている場合は機能しません。
$ echo small*jpg
small1.jpg small2.jpg small photo 1.jpg small photo 2.jpg
$ echo small*jpg | tr ' ' '\n'
small1.jpg
small2.jpg
small
photo
1.jpg
small
photo
2.jpg
を使用してこれを行うことができることを知っていますが、をls -d1
使用してこれを実行することも可能ですかecho
?
答え1
echo
printf
いかなる場合でも、任意のデータを出力するために使用することはできません。echo
これは、テキスト出力用の破損したユーティリティをPOSIXに置き換えます。
printf '%s\n' small*jpg
次のようにすることもできます。
printf '%s\0' small*jpg
リストをNULで区切られたレコードに出力します(たとえば、GNUを使用して後処理できます。xargs -r0
改行文字は、ファイル名のスペースまたは文字と同じように有効であることを覚えておいてください)。
POSIXが登場する前は、kshを置き換えるユーティリティがprintf
ありました。 zshがそれをコピーし、1行に1つの引数を印刷するオプションを追加しました。print
echo
-l
print -rl -- small*jpg
ksh93は印刷に似た-f
オプションを追加します。また、コピーされましたが、他のksh実装ではコピーされませんでした。print
printf
zsh
print -f '%s\n' -- small*jpg
引数が指定されていない場合、これらの関数はすべて空白行を印刷します。より良いアプローチprintln
は、次の関数で書くことです。
println() {
[ "$#" -eq 0 ] || printf '%s\n' "$@"
}
存在するzsh
:
println() print -rC1 -- "$@"
答え2
echo
引数で受け取った文字列を区切るには、空白のみを使用してください。
あなたの質問がタグ付けされたので強く打つ、内容は次のとおりですhelp echo
(bash
強調):
ARGマーク、単一のスペース文字で区切られたその後、標準出力では改行文字が続きます。
他の実装文書でも同様の説明を見つけることができます。例えばecho
~からcoreutils
、GNU/Linuxにあります。
echo
各文字列の間にスペースを入れ、最後の文字列の後に改行を追加して、与えられた各文字列を標準出力に書き込みます。
ファイル名を別々の行に印刷するには、単一の文字列echo
として指定する必要があります。
$ touch "small1.jpg" "small2.jpg" "small photo 1.jpg" "small photo 2.jpg"
$ (set -- small*.jpg; IFS='
'; echo "$*")
small1.jpg
small2.jpg
small photo 1.jpg
small photo 2.jpg
ここでは特殊パラメータの動作を活用します*
。二重引用符の中には次のように拡張されます。一言ここで、位置引数配列の要素は、IFS
変数の最初の文字(改行文字として設定)を使用して連結されます。
この(...)
構文は、サブシェル環境でコマンドを実行するために使用されます。通常、私たちはメインシェルに影響を与えたくありません。
ただし、次にecho
説明するように、すべての制限はまだ適用されます。スティーブンの答えそのため、この場合は使用しないことをお勧めします。