使用此脚本以更轻松的方式查找文件

不记得下载了哪个文件?试试 lf 脚本,轻松解决问题。
104 位读者喜欢这篇文章。
Filing cabinet for organization

这里有一个场景:每当我需要一些源代码、美术资源包或互联网上的游戏时,我都会将其下载到我的 ~/Downloads 目录,导航到该文件夹,然后立即意识到我忘记了文件名。并不是我不记得我下载了什么;而是文件类型的激增让我感到困惑。是 tarball 还是 ZIP 文件?版本号是多少?我以前下载过副本吗?

或者,也许我知道我创建了一个文件,但几天后我就不记得完整的文件名了。也许我记得文件名中的一个字符串,但不记得确切的单词排列。

简而言之,变量太多了,我无法自信地发出命令,而不列出目录内容并使用 grep 搜索文件名的一些子字符串。

为了简化此过程,我在我的 ~/bin 目录中保留了一个名为 lf 的命令。它只是流行的 findlocate 命令的一个简单前端,但键入更少,功能也少得多。

例如,要在当前目录中查找文件名中包含字符串 *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
接下来阅读什么
标签
User profile image.
Klaatu 是一位 Unix 极客,也是 Hacker Public Radio 和 GNU World Order 的播客。

6 条评论

当我忘记下载的文件名时,我会这样做

cd Downloads
ls -rt

它通常是列表底部的文件

很棒的东西!

也许可以使用 grep 添加更多颜色

/usr/bin/find "${PATH}" "${MATCH}" "*${ARG}*" | /usr/bin/grep --color $ARG

这将突出显示搜索的术语...

问候!!

我不知道为什么人们如此频繁地使用 'find'。在大多数情况下,总有更好的方法。对于这种简单的搜索,您可以使用 shell glob。$ ls *foo*
如果您启用 starglob (shopt -s starglob) 并想搜索子目录,则可以使用 $ ls **/*foo* 或隐藏子目录 $ ls .**/*foo*

我发现这个脚本很有用
- 它节省了击键次数
- 它在子文件夹中搜索
- 它显示了找到文件的路径

回复 ,作者:castaway (未验证)

我建议不要在任何脚本中使用 PATH 作为变量名,因为这已经是 shell 的内部变量。

通过覆盖 PATH,您将被迫在脚本中使用命令的完整路径,例如:'/usr/bin/find' 而不是简单的 'find'。

干杯!

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.