这里有一个场景:每当我需要一些源代码、美术资源包或互联网上的游戏时,我都会将其下载到我的 ~/Downloads 目录,导航到该文件夹,然后立即意识到我忘记了文件名。并不是我不记得我下载了什么;而是文件类型的激增让我感到困惑。是 tarball 还是 ZIP 文件?版本号是多少?我以前下载过副本吗?
或者,也许我知道我创建了一个文件,但几天后我就不记得完整的文件名了。也许我记得文件名中的一个字符串,但不记得确切的单词排列。
简而言之,变量太多了,我无法自信地发出命令,而不列出目录内容并使用 grep 搜索文件名的一些子字符串。
为了简化此过程,我在我的 ~/bin 目录中保留了一个名为 lf 的命令。它只是流行的 find 或 locate 命令的一个简单前端,但键入更少,功能也少得多。
例如,要在当前目录中查找文件名中包含字符串 *foo* 的文件
$ lf foo
/home/klaatu/foo.txt
/home/klaatu/goodfood.list
/home/klaatu/tomfoolery.jpg
要在另一个目录中查找文件名中包含字符串 *foo* 的文件
$ lf --path ~/path/to/dir foo
这纯粹是一个偷懒的工具,而且由于我很懒,所以我经常使用它。
脚本
#!/bin/sh
# lazy find
# GNU All-Permissive License
# Copying and distribution of this file, with or without modification,
# are permitted in any medium without royalty provided the copyright
# notice and this notice are preserved. This file is offered as-is,
# without any warranty.
## help function
function helpu {
echo " "
echo "Fuzzy search for filename."
echo "$0 [--match-case|--path] filename"
echo " "
exit
}
## set variables
MATCH="-iname"
SEARCH="."
## parse options
while [ True ]; do
if [ "$1" = "--help" -o "$1" = "-h" ]; then
helpu
elif [ "$1" = "--match-case" -o "$1" = "-m" ]; then
MATCH="-name"
shift 1
elif [ "$1" = "--path" -o "$1" = "-p" ]; then
SEARCH="${2}"
shift 2
else
break
fi
done
## sanitize input filenames
## create array, retain spaces
ARG=( "${@}" )
set -e
## catch obvious input error
if [ "X$ARG" = "X" ]; then
helpu
fi
## perform search
for query in ${ARG[*]}; do
/usr/bin/find "${SEARCH}" "${MATCH}" "*${ARG}*"
done
6 条评论