web-dev-qa-db-ja.com

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

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

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

そして

locate postgis-2.0.0

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

182
Sam007

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

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

幸運を

230
adempewolff

私が試してみます:

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

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

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

Sudo updatedb

最初。何らかの理由で、私はlocateとは運がありません。

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

29
reverendj1

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

find . -type d | grep DIRNAMEを試してください

13
Mitch

他の答えは良いですが、Permission deniedステートメントを省略すると、より明確な答えが得られます(stderrを実行しないため、Sudosは省略します)。

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

10
zanbri

find . -name "*file_name*"を試してください

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

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

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

4
RuiVBoas

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

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

tree -f  / | grep postgis-2.0.0

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

3
ptetteh227

$ find . -type f | grep IMG_20171225_*
与える
./03-05--2018/IMG_20171225_200513.jpg
コマンドfindの後のDOTは、開始点を示すことです。
したがって、現在のフォルダー、
名前フィルターIMG_20171225_*を介して「パイピング」(=フィルター済み)

0
Jadeye

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

bash

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