結果を複数行に印刷

結果を複数行に印刷

以下のログファイルを見つけようとします。/usr/

$ echo /usr/**/log
/usr/bin/log /usr/lib/log /usr/local/Cellar/ruby/2.5.1/lib/ruby/gems/2.5.0/doc/rubygems-2.7.6/ri/Gem/Resolver/Molinillo/DependencyGraph/log /usr/local/Cellar/ruby/2.5.1/share/ri/2.5.0/system/Gem/Resolver/Molinillo/DependencyGraph/log 

読みにくい一行で印刷されています。

$ for i in /usr/**/log; do echo $i; done
/usr/bin/log
/usr/lib/log
/usr/local/Cellar/ruby/2.5.1/lib/ruby/gems/2.5.0/doc/rubygems-2.7.6/ri/Gem/Resolver/Molinillo/DependencyGraph/log
/usr/local/Cellar/ruby/2.5.1/share/ri/2.5.0/system/Gem/Resolver/Molinillo/DependencyGraph/log
/usr/local/Cellar/ruby/2.5.1/share/ri/2.5.0/system/WEBrick/log
/usr/local/lib/python3.6/site-packages/zmq/log
/usr/local/lib/ruby/gems/2.5.0/doc/rubygems-2.7.6/ri/Gem/Resolver/Molinillo/DependencyGraph/log
/usr/local/var/log
/usr/share/zsh/5.3/help/log

構造化コードを置き換えるための1行のソリューションはありますか?

答え1

printf改行文字を含む文字列を印刷するには、包含書式指定子を使用してください。また、そうしないと妥当な理由がない限り、シェルスクリプトで変数を参照することは常に安全です。

nullglobまた、拡張されていないグローバル一致を無視するオプションをオンにします。

shopt -s nullglob
printf '%s\n' /usr/**/log

答え2

使用find:

find /usr -name log

logこれは、名前がディレクトリ内またはその下にあるすべてのエントリのパス名を見つけるための移植可能な方法です/usr。通常のファイルに制限するには、以下を追加します-type f

find /usr -type f -name log

echoすべてのオペランドを空白文字で区切り、最後に改行文字で区切って1行に印刷します。これが最初のコマンドで複数行の出力が得られない理由です。

関連情報