find* は Debian では「*」というファイルを検索しますが、RHEL では検索しません。

find* は Debian では「*」というファイルを検索しますが、RHEL では検索しません。

違いは何ですか?これらのディストリビューションは異なる方法で処理されますか?それとも構成が違いますか?何を比較して調整する必要がありますか?find *ワイルドカード自体を一致させたくありません。

  • *1つのホストも一致するため、結果は異なります。レッドハットホスティングDebian ホスティング*検索もしてみてください。ところで名前はありません*
  • プラットフォーム:Debian Wheezy 7、Red Hat Enterprise Linux 7。常にBashを使用してください。
  • grepになければなりません/etc/etc/hostnameホストごとに1つの一致しか存在できません。Debian ホスティングcat /etc/sysconfig/network待つレッドハットホスティング
DebianHost# cat $(search /etc/ *) 2>/dev/null | grep $(ホスト名)
検索: '*':対応するファイルまたはディレクトリがありません。
Debian ホスティング
Debianホスト#
Debianホスト#
Debianホスト#
DebianHost# ホスト名
Debian ホスティング
Debianホスト#
Debianホスト#
Debianホスト#
Debianホスト#pwd
/根
Debianホスト#
Debianホスト#
Debianホスト#
Debianホスト#ls -1。
Debianホスト#
Debianホスト#
Debianホスト#
DebianHost# grep -r $(ホスト名) /etc
/etc/ホスト名:DebianHost
Debianホスト#
Debianホスト#
Debianホスト#
DebianHost# /etc/ * grep -e “*”を探す
検索: '*':対応するファイルまたはディレクトリがありません。
Debianホスト#

RedHatHost#cat $(search /etc/ *)2> / dev / null | grep $(ホスト名)
ホスト名=RedHatHost
レッドハットホスティング#
レッドハットホスティング#
レッドハットホスティング#
RedHatHost# ホスト名
レッドハットホスティング
レッドハットホスティング#
レッドハットホスティング#
レッドハットホスティング#  
RedHatHost#pwd
/根
レッドハットホスティング#
レッドハットホスティング#
レッドハットホスティング#
RedHatHost# ls -1 。
アナコンダ-ks.cfg
インストールログ
インストール.ログ.syslog
レッドハットホスティング#
レッドハットホスティング#
レッドハットホスティング#
RedHatHost# grep -r $(ホスト名) /etc/
/etc/sysconfig/network:HOSTNAME=RedHatHost
レッドハットホスティング#
レッドハットホスティング#
レッドハットホスティング#
レッドハットホスティング#
RedHatHost# /etc/ * grep -e “*” 検索
レッドハットホスティング#

答え1

どちらの場合も、*シェルによって拡張されます。おそらく、シェルがワイルドカードを拡張せずにそのままプログラムに渡すWindowsから来たのでしょう。これはUnixシェルが機能する方法ではありません。

これを確認する最善の方法は、両方のコンピュータecho *で話すことです。 Debian コンピュータは*ファイルがないディレクトリで実行しているので、印刷されるので*プログラムに渡されます。 (私はあなたがワイルドカードが何も一致しないときに呼び出されたプログラムにワイルドカードを渡すBashを実行していると仮定します。)Red Hatシステムは次のように言います。

anaconda-ks.cfg install.log install.log.syslog

つまり、実行中のディレクトリ内の3つのファイル名が、引数を区切るスペースechoとともに印刷に渡されます。

find /etc/ *実際には合理的な命令ではないので、これによって何を達成したいのか分かりませんfind/etcツリー内のすべてのファイルをリストしたい場合はfind /etcそれで十分です。

答え2

*引用符で囲まれていないワイルドカード(それ自体がワイルドカード)を含む場合は、次のように処理されます。全体的な状況そして拡張シェルを通してこのパターンに一致するファイルのリストに移動します。

この特定のパターン(*)は非表示のファイル名と一致するため、シェルをfind呼び出す前に現在のディレクトリにある非表示のファイルのリストに展開されます。したがって、現在のディレクトリにfileという名前のファイルと別の名前のfileが含まれているfoo場合は、次のパラメータを使用して呼び出されfoo barますfind

"find", "/etc/", "foo", "foo bar"

現在のディレクトリに隠されていないファイルがない場合、他のシェルは異なる動作をします。csh、、、、tcshが発行されfishますzsh矛盾エラーメッセージが表示され、コマンドは実行されません。 POSIX シェルは引き続き呼び出されますが、findモードは拡張されません。したがって、ここではfind次のパラメータを使用して呼び出しが行われます。

"find", "/etc/", "*"

find(および(この場合は存在しません)ですべてのファイルを見つける必要があります。)おそらく、RedHatでは隠されていないファイルを含むディレクトリからコマンドを呼び出しますが、Debianは隠しファイルだけを含むディレクトリからコマンドを呼び出します。 。/etc/*

ちなみに

cat $(find /etc/ *) 2>/dev/null | grep $(hostname)

間違った。

次のように書く必要があります。

find /etc -type f -exec cat {} + | grep -Fe "$(hostname)"

それとももっと役に立つかもしれません:

find /etc -type f -exec grep -Fe "$(hostname)" {} +

あるいは、DebianとRedHatの両方にGNU grepがあるからです。

grep -rFe "$(hostname)" /etc

答え3

find /etc *名前のファイルが見つかりません*。動作方法は、現在のディレクトリが空かどうかによって異なります。

  • 空の場合、シェルはfind /etc *独自に拡張され、両方のディレクトリをfind繰り返して/etc存在しないと*文句を言います*(以下にリストされているすべてのファイルを除く/etc)。これがDebianで見ることができるものです。
  • 空でない場合は、シェルが展開され、現在のディレクトリのファイルのリストが続きfind /etc *ます。find /etcしたがって、現在のディレクトリ自体を除いて、現在のディレクトリの下のすべてのファイルだけでなく、下のすべてのファイルも一覧find表示されます。/etcこれがRHELで見られるものです。

違いは展開には関係なく、両方のコンピュータの異なるコンテキストでテストしています。

これは名前付きファイルの検索に関連しています*。名前でファイルを検索するには、述語を使用する必要があります-namefind /etc -name somenameパラメータは、-nameシェルのワイルドカードパターンと同様に、ワイルドカードパターンです。この文字*はワイルドカードなので、名前付きファイルを見つけるには*ワイルドカードをバックスラッシュで保護する必要がありますfind -name '\*'。 2つのレベルの引用に注意してください。文字\やシェルの拡張を防ぐために単一引用符(または代わりに使用できます*)とパターンが「すべての文字シーケンス」ではなく「リテラル」になるようにバックスラッシュを使用します。find -name "\\*"find -name \\\*find\**

*ファイル名には有効ですが一般的ではない文字です。名前がある文字を実際に一致させずに*すべてのファイルを一致させたい場合は、書き込むことができますが(再度、シェルが拡張しないように引用する必要がありfind /etc -name '*'ます)と同じではありません。*find /etc

より正確には、現在のディレクトリにドットファイル以外のファイルが含まれているかどうか、つまり名前で終わらないファイルが含まれているかどうかです.

関連情報