私はLinux / Unixに関する本を読むことにしました。私はコマンドの出力を拡張としてシェルにパイプする方法を説明する章を読んだ。
次のコマンド
file $(ls /usr/bin/* | grep zip)
代わりに、「ファイル名(ファイルやディレクトリなし)を開くことができません」というエラーが表示されます。
file $(ls | grep zip)
フォルダに関係なく、すべてが正常に表示されます。なぜ?これは一種の議論の制限ですか?
もし私がするなら
file $(ls Pictures/ | grep jpg)
次のメッセージが表示されます。
1234.jpg: ERROR: cannot open 1234.jpg (No such file or directory)
リストしたいディレクトリに直接移動するとき
nassosdim@ubuntu:~$ cd Pictures/
nassosdim@ubuntu:~/Pictures$ file $(ls | grep jpg)
ファイルの結果を印刷
1234.jpg: JPEG image data, JFIF standard 1.01
誰かが私に何が起こっているのかを説明できますか? :(
ベストアンサー1
このエラーは、bashが*
globパターンマッチングを使用して引数をlsに拡張しようとするために発生します。 globがパターンと一致しない場合、常にこのようなエラーが発生します。その後、実際のアスタリスクに*
渡されます。ls
これはファイルとも一致しないため、ls
エラーが発生します!
現在実行中の作業について重複するいくつかの点があります。あなたが構造を学びようとしていることを知っていますが、あなたが達成したものとそれを達成した方法を分析しましょう。
ls /usr/bin
binディレクトリにあるファイルをリストするだけで十分です。アスタリスクはまったく必要ありません。- 君は絶対にならない出力の解析
ls
それにもかかわらず、これはあいまいで潜在的に危険です。 - 次のようにしてgrepなしで同じ効果を得ることができますが、
ls /usr/bin/*zip*
これはls
まだ重複しているため、glob拡張をファイルに渡すことができます。file /usr/bin/*zip*
最後に、find
ファイルを見つけるためのより良いツールがあることがよくあります。次のようにしたいことができます。
$ find /usr/bin -iname '*zip*' -exec file {} +