echoを使用して1行に1つのファイルを印刷する

echoを使用して1行に1つのファイルを印刷する

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

echoprintfいかなる場合でも、任意のデータを出力するために使用することはできません。echoこれは、テキスト出力用の破損したユーティリティをPOSIXに置き換えます。

printf '%s\n' small*jpg

次のようにすることもできます。

printf '%s\0' small*jpg

リストをNULで区切られたレコードに出力します(たとえば、GNUを使用して後処理できます。xargs -r0改行文字は、ファイル名のスペースまたは文字と同じように有効であることを覚えておいてください)。

POSIXが登場する前は、kshを置き換えるユーティリティがprintfありました。 zshがそれをコピーし、1行に1つの引数を印刷するオプションを追加しました。printecho-l

print -rl -- small*jpg

ksh93は印刷に似た-fオプションを追加します。また、コピーされましたが、他のksh実装ではコピーされませんでした。printprintfzsh

print -f '%s\n' -- small*jpg

引数が指定されていない場合、これらの関数はすべて空白行を印刷します。より良いアプローチprintlnは、次の関数で書くことです。

println() {
  [ "$#" -eq 0 ] || printf '%s\n' "$@"
}

存在するzsh

println() print -rC1 -- "$@"

答え2

echo引数で受け取った文字列を区切るには、空白のみを使用してください。

あなたの質問がタグ付けされたので、内容は次のとおりですhelp echobash強調):

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説明するように、すべての制限はまだ適用されます。スティーブンの答えそのため、この場合は使用しないことをお勧めします。

関連情報