UNIXシステムでは、「locate」はデータベースで、選択された名前のファイル、または選択された名前のフォルダー内のファイルを検索します。 Locateを使用してファイルではなくフォルダのみを出力するにはどうすればよいですか?
私はこの解決策を採用しました:
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
実際、locate
には、--regexp
オプションを使用した場合に必要なものがあり、探しているディレクトリと同じ名前のファイルを吐き出してもかまいません。 「行末」位置マーカーは仕事を成し遂げます:
locate -r '/dirname$'
locate
は、必要に応じて--ignore-case
もサポートします。
Findコマンドを使用してみませんか?
find . -name YOUR_SEARCH_NAME -type d
locate
自体はあなたのためにそれを行うことはできません。したがって、UNIXでそれを行う方法は、locate
の出力をフィルタリングすることです。
locate --null something | xargs -r0 sh -c 'for i do [ -d "$i" ] && printf "%s\n" "$i"; done' sh {} +
スコットウィルソンの答えで示唆されているように、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を更新する必要があります)。オリバーザルツブルクのすっきりとしたラインをあなたの.bashrc
に入れる:
# locate directories:
# -------------------
locd () {
locate $1 | xargs -I {} bash -c 'if [ -d "{}" ]; then echo {}; fi'
}
そうすれば、ディレクトリだけを見つけたいときはいつでもlocd something
と入力できます。
これらを最後の行として、または自分に最適な場所に配置します。
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 ; }
これがお役に立てば幸いです、乾杯