ファイル名に改行が含まれる可能性を無視して、sed
pringleyが彼の回答で示唆しているように使用するか、次のコマンドでwhile
ループを作成できます。read
find . |
while read -r line
do
echo "$line$line"
done
(-r
は「生の」入力用です。これは、シェルが入力でバックスラッシュ エスケープ シーケンスを展開するのを停止し、シェル内のread
コマンドの標準 POSIX 機能です。)
に言及しているので、改行の代わりにヌルバイト(Cの場合)で各名前を終了するオプションをbash
使用して、ファイル名の改行の問題を回避し、次を使用できます。find . -print0
'\0'
find . -print0 |
while read -r -d '' line
do
echo "X${line}${line}X"
done
は、通常の改行区切り文字を文字列引数の最初の-d ''
文字に置き換えますが、文字列は空であるため、最初の文字だけがヌル バイトです。
for
次の行に沿ってループを使用する簡単な方法はありません (私の知る限り、難しい方法もありません) 。
for line in $(find .)
do
echo "X${line}${line}X"
done
これは、スペースまたは改行を含む名前に対して確実に機能します。
多くの場合、コマンドを使用したい場合がありますxargs
。これは標準入力を読み取り、標準入力から読み取ったものをコマンドの引数として使用してコマンド ラインを作成します。
find . | xargs wc -l
または、改行とスペースの安全性 (デフォルトでは、xargs
スペース、タブ、および改行で引数を分割します):
find . -type f -print0 | xargs -0 wc -l
適用できるオプションはたくさんありますxargs
— 特に GNU バージョンです。
find
ただし、大部分がxargs
冗長になるオプションもあります。
find . -type f -exec wc -l {} +
これは基本的にコマンドと同じ仕事をしfind . -print0 | xargs -0 wc -l
ます。1 つの違いは、 からの出力にファイルがない場合find
、 using-exec
はまったく実行wc
されませんが、デフォルトでxargs
は 1 回実行されます (ファイル名の引数なし。これは POSIX 準拠のためです)。GNUでは、 orをxargs
使用してその発生を止めることができます。とにかくMac OS Xはそうしているようです。-r
--no-run-if-empty
xargs