以下のログファイルを見つけようとします。/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行に印刷します。これが最初のコマンドで複数行の出力が得られない理由です。