web-dev-qa-db-ja.com

ファイルを名前と部分パスで検索するにはどうすればよいですか。

私はファイル名を持っていることが多く、それは部分的なパスです。 "content/docs/file.xml".

ディレクトリ名とファイル名を別々に指定するために手動で名前を部分的に切り分けることなく、そのファイルを検索する簡単な方法はありますか?

findがそのように機能していれば素晴らしいと思いますので、find content/docs/file.xmlを実行できますが、残念ながらうまくいきません。

61
user69817

何にでも一致することを示すには、ワイルドカード*を渡します。また、*をエスケープする必要があります。

find . -path \*content/docs/file.xml

または、パターンを引用符で囲みます。

find . -path "*content/docs/file.xml"

Manページで説明されているように、

$見つけます。 -name * .c -print

find:pathはexpressionの前になければなりません

これは、*。cがシェルによって展開され、findが実際に次のようなコマンドラインを受け取るためです。

見つけます。 -name bigram.c code.c frcode.c locate.c -print

そのコマンドはもちろん機能しません。このようにするのではなく、パターンを引用符で囲むか、ワイルドカードをエスケープする必要があります。

$見つけます。 -name\*。c -print

69
Bob

findに-wholenameオプションもありますfind $top_dir -wholename *string*

find /usr -wholename *in/abiw*

>/usr/bin/abiword
8
technosaurus
find . -type f | grep "content/docs/file.xml"

あるいは単に

locate content/docs/file.xml
3
Nifle

例えば、アスタリスク/ワイルドカード(*)をdir=“/apps/*/instance01/"として使用している場所でファイルを検索するには、find ${dir} -name “*.jks”を使用できます。このようにすべてのファイルを配列に配置します。

arr=(`find ${dir} -name “*.jks"`)

他の拡張子を持つファイルを取得したい場合は、次のように「または」を使用します。

-name "*.keystore" -o -name "*.jks" -o -name “*.p12"は単一の文字列しか受け付けないため、-nameは「or」を使用します。

最後にすべてをこのように配列に配置します。

arr=(`find ${dir} -name "*.keystore" -o -name "*.jks" -o -name "*.p12"`)

部分パスではなくフルパスがある場合は、このように配列に配置するほうがはるかに簡単です。

arr=(“/Users/ajay/Documents/keystore_and_p12files/"*.{keystore,p12,jks})
1
user450631