違いは何ですか?これらのディストリビューションは異なる方法で処理されますか?それとも構成が違いますか?何を比較して調整する必要がありますか?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で見られるものです。
違いは展開には関係なく、両方のコンピュータの異なるコンテキストでテストしています。
これは名前付きファイルの検索に関連しています*
。名前でファイルを検索するには、述語を使用する必要があります-name
。find /etc -name somename
パラメータは、-name
シェルのワイルドカードパターンと同様に、ワイルドカードパターンです。この文字*
はワイルドカードなので、名前付きファイルを見つけるには*
ワイルドカードをバックスラッシュで保護する必要がありますfind -name '\*'
。 2つのレベルの引用に注意してください。文字\
やシェルの拡張を防ぐために単一引用符(または代わりに使用できます*
)とパターンが「すべての文字シーケンス」ではなく「リテラル」になるようにバックスラッシュを使用します。find -name "\\*"
find -name \\\*
find
\*
*
*
ファイル名には有効ですが一般的ではない文字です。名前がある文字を実際に一致させずに*
すべてのファイルを一致させたい場合は、書き込むことができますが(再度、シェルが拡張しないように引用する必要がありfind /etc -name '*'
ます)と同じではありません。*
find /etc
より正確には、現在のディレクトリにドットファイル以外のファイルが含まれているかどうか、つまり名前で終わらないファイルが含まれているかどうかです.
。