web-dev-qa-db-ja.com

フォルダーのみを検索するために検索を使用する方法

UNIXシステムでは、「locate」はデータベースで、選択された名前のファイル、または選択された名前のフォルダー内のファイルを検索します。 Locateを使用してファイルではなくフォルダのみを出力するにはどうすればよいですか?

5
shrx

私はこの解決策を採用しました:

locate -i "$foldername" | while read line
        do
            if [[ -d "$line" && `echo ${line##*/} | tr [:upper:] [:lower:]` = *`echo $foldername | tr [:upper:] [:lower:]`* ]]; then
                echo "$line"
            fi
        done
0
shrx

実際、locateには、--regexpオプションを使用した場合に必要なものがあり、探しているディレクトリと同じ名前のファイルを吐き出してもかまいません。 「行末」位置マーカーは仕事を成し遂げます:

locate -r '/dirname$'

locateは、必要に応じて--ignore-caseもサポートします。

10
Frank M

Findコマンドを使用してみませんか?

find . -name YOUR_SEARCH_NAME -type d
3
Scott C Wilson

locate自体はあなたのためにそれを行うことはできません。したがって、UNIXでそれを行う方法は、locateの出力をフィルタリングすることです。

locate --null something | xargs -r0 sh -c 'for i do [ -d "$i" ] && printf "%s\n" "$i"; done' sh {} +
2
Der Hochstapler

スコットウィルソンの答えで示唆されているように、findは私が使用したであろうものです。ただし、ロケートDBを本当に使用する必要がある場合は、ハッキングソリューションが必要になる可能性があります。

Sudo strings /var/lib/mlocate/mlocate.db | grep -E '^/.*dirname'
  • Sudoデータベースは通常のユーザーが直接読み取ることができないため、.
  • stringsはメタデータを削除します(これにより、読み取り権限がないディレクトリも検索できます。これは通常、locateが妨げます)。
  • /var/lib/mlocate/mlocate.dbは、明らかにUbuntuのDBパスです(例として。他のディストリビューションでは、/var/lib/slocate/slocate.dbなどの他の場所にパスがある場合があります)。
  • grep -E正規表現を有効にします。
  • ^/.*dirnameは、/で始まるすべての行に一致します。これは、DB内のすべてのディレクトリがたまたま実行し、その後に任意の文字が何度も続き、その後に検索ワードが続きます。

このソリューションの良い面:

  • findよりも高速です。
  • grep(または他のお気に入りのテキスト処理ツール)のすべてのベルとホイッスルを使用できます。

マイナス面:

  • 一般的にはlocateと同じです(DBを更新する必要があります)。
  • ルートアクセスが必要です。
1

オリバーザルツブルクのすっきりとしたラインをあなたの.bashrcに入れる:

# locate directories:
# -------------------
locd () {
    locate $1 | xargs -I {} bash -c 'if [ -d "{}" ]; then echo {}; fi'
}

そうすれば、ディレクトリだけを見つけたいときはいつでもlocd somethingと入力できます。

1
JosephHarriott

これらを最後の行として、または自分に最適な場所に配置します。
gedit〜/.bashrc

#system only
slocate() { locate $@ | egrep -v ˆ/home ; }

#system directories only
dslocate() { for directory in `locate $@ | egrep -v ˆ/home`; do if [ -d "$directory" ]; then echo $directory; fi; done ; }

#whole system directories only
dlocate() { for directory in `locate $@`; do if [ -d "$directory" ]; then echo $directory; fi; done ; }

#local user's only
llocate() { locate $@ | egrep ˆ/home ; }

#local user's directories only
ldlocate() { for directory in `locate $@ | egrep ˆ/home`; do if [ -d "$directory" ]; then echo $directory; fi; done ; }


これがお役に立てば幸いです、乾杯

0
tao