コマンドラインを使用して名前でファイルを見つける


183

コマンドラインを使用してファイルの場所を特定したいと思います。私が試してみました:

find . -type f -name "postgis-2.0.0"

そして

locate postgis-2.0.0

無駄に。ファイルの名前を指定して、ファイルのディレクトリを決定するコマンドは何ですか?


2
locateコマンドは結構です、ちょうどコマンドを使用して、最初のlocatedbを更新updatedb
thucnguyen

既にインストールされている場合、新しいファイル名はpostgis-2.0.0もうないかもしれません。通常、パッケージマネージャーを使用してインストールした後、実行可能ファイルはいずれかの$PATHフォルダーに格納されますwhich postgis。場所を確認してください。何も返されない場合は、ファイルの場所を手動で探す必要があります。
sdkks

回答:


232

find ~/ -type f -name "postgis-2.0.0"代わりに試してください。

を使用.すると、現在のディレクトリのみが検索されます。 ~/ホームディレクトリ全体(おそらくダウンロード先)を検索します。wgetrootとして使用した場合、どこか他の場所にある可能性があるため/、ファイルシステム全体を検索するために使用できます。

幸運を


1
ああ、私wgetはルートとして使用して/いましたので、感謝しました
-Sam007

詳細については、このリンクを確認してくださいhelp.ubuntu.com/community/find
habibun

検索結果:/ Users / UserName // Library / Saved Application State / com.bitrock.appinstaller.savedState:Permission denied error。コマンドを実行するたびに表示されます。それを取り除く方法は?
エドゥアルド

29

私が試してみます:

sudo find / -type d -name "postgis-2.0.0"

。現在のディレクトリでのみ検索することを意味します。本当にわからない場合は、ルートからすべてを検索するのが最善です。また、タイプ-fは、フォルダーではなくファイルの検索を意​​味します。追加sudoすると、すべてのフォルダー/サブフォルダーを検索できます。

の構文locateは正しいですが、実行する必要がある場合があります

sudo updatedb

最初。何らかの理由で、私は幸運を持ってlocateいません。

locateが作成したファイルとディレクトリのデータベースを使用しますupdatedb。したがって、新しいファイルをダウンロードした場合はupdatedb、ファイルとディレクトリのデータベースを更新していない可能性が高くなります。ユーティリティプログラムを使用するsudo updatedb前に使用できますlocateupdatedb通常、Linuxシステムでは1日1回単独で実行されます。


14

findは、最も便利なLinux / Unixツールの1つです。

試してみる find . -type d | grep DIRNAME


ここでgrep over -nameを使用する利点はありますか?
-TryHarder

@oooooo以下の回答に理由を追加しました
zanbri

見つけプラスgrepが私のために働いただけのものだった
malhal

12

他の答えは良いですが、Permission deniedステートメントを省略すると、より明確な答えが得られることがわかります(stderr実行していないためにsがありませんsudo):

find / -type f -iname "*postgis-2.0.0*" 2>/dev/null

どこ:

  • / 検索を開始するディレクトリに置き換えることができます
  • fdファイルの代わりにディレクトリを検索している場合に置き換えることができます
  • -iname-name検索で大文字と小文字を区別する場合は、に置き換えることができます
  • *あなたが検索でワイルドカードを使用しない場合は、検索語中のSは省略することができます

別の方法は次のとおりです。

find / -type f 2>/dev/null | grep "postgis-2.0.0"

この方法は、検索語が完全なファイルパスのどこかに一致する場合に結果を返します。たとえば、 /home/postgis-2.0.0/docs/Readme.txt


2
ある-regex-iregexして検索するためのスイッチは、Regular Expressionsパスが同様に言及見つけることになります。ファイル(-type f)であるアイテムを見つける提案は、grepリソースをより多く消費します。Permission deniedユーザーがファイルまたはフォルダーにアクセスできない場合に発生します。findを使用sudoすると、findはすべてのファイルを表示できます。
sdkks

1
正規表現スイッチについて知っていただきありがとうございます。
zanbri

@zanbriを使用する-wholenameか、-iwholename代わりにに配管しgrepます。
wjandrea 16

4

試してみる find . -name "*file_name*"

  • 「。」(現在のディレクトリを調べる)を「/」(システム全体を調べる)または「〜/」(ホームディレクトリを調べる)に変更できます。

  • 大文字と小文字を区別しない場合は、「-name」を「-iname」に変更できます。

  • ここで、「file_name」(何でも開始および終了できるファイル)をファイルの正確な名前に変更できます。


3

これにより、ファイルの検索が簡単になります。

これにより、ファイルへのフルパスが得られます。

tree -f  / | grep postgis-2.0.0

ツリーは、ディレクトリの内容をツリーのような形式でリストします。-fファイルへのフルパスを提供するようツリーに指示します。その場所や親の場所がわからないので、ファイルシステムのルートから/再帰的に下向きに検索してください。次に、出力をgrepに送信して単語を強調表示し、postgis-2.0.0


0

一方でfind、コマンドが再帰的にディレクトリツリーをトラバースする最も簡単な方法があり、そこに他の方法であり、特定のデフォルトでのUbuntuに付属している2つのスクリプト言語は、すでにそうする能力を持っています。

バッシュ

bash にはglobstar、ディレクトリツリーの再帰的な走査を可能にする非常に優れたシェルオプションがあります。行う必要があるのは、./**/*展開内のアイテムがファイルであるかどうか、および必要なテキストが含まれているかどうかをテストすることだけです。

bash-4.3$ for f in ./**/* ;do [ -f "$f" ] && [[ "$f" =~ "postgis-2.0.0" ]] && echo "$f"; done 
./testdir/texts/postgis-2.0.0

Perl

Perlには、ディレクトリツリーの再帰的な走査を実行し、サブルーチンを介して特定のアクションを実行できるFindモジュールがあります。小さなスクリプトを使用すると、ディレクトリツリーを走査し、目的の文字列を含むファイルを配列にプッシュして、次のように出力できます。

#!/usr/bin/env perl
use strict;
use warnings;
use File::Find;

my @wanted_files;
find(
     sub{ 
         -f $_ && $_ =~ $ARGV[0]  
               && push @wanted_files,$File::Find::name
     }, "."
);

foreach(@wanted_files){
    print "$_\n"
}

そしてそれがどのように機能するか:

$ ./find_file.pl  "postgis-2.0.0"                                                       
./testdir/texts/postgis-2.0.0

Python

Pythonは、Ubuntuの世界で非常に広く使用されている別のスクリプト言語です。特に、os.walk()上記と同じアクションを実行できるモジュールがあります。ディレクトリツリーを走査し、目的の文字列を含むファイルのリストを取得します。

ワンライナーとして、これは次のように実行できます。

$ python -c 'import os;print([os.path.join(r,i) for r,s,f in os.walk(".") for i in f if "postgis-2.0.0" in i])'                                                                         
['./testdir/texts/postgis-2.0.0']

完全なスクリプトは次のようになります。

#!/usr/bin/env python
import os;

for r,s,f in os.walk("."):
    for i in f:
        if "postgis-2.0.0" in i:
            print(os.path.join(r,i))

0

$ find . -type f | grep IMG_20171225_*
得られる
./03-05--2018/IMG_20171225_200513.jpg
DOTコマンドが後find、出発点を述べることである
従って-現在のフォルダを、
名前フィルターを通して(=を濾過)「パイプ」IMG_20171225_*

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.