Bash函数,用于处理目录(不包括目录)中的所有点文件

Bash函数,用于处理目录(不包括目录)中的所有点文件,bash,grep,find,bash-function,Bash,Grep,Find,Bash Function,我希望创建一个bash函数来过滤所选目录中的所有点文件(没有目录)。我只需要文件名,不需要完整路径 目前,我只有以下命令: find . -maxdepth 1 -type f -print0 它打印除目录之外的所有文件。现在我仍然需要排除非dot文件。因此,我尝试通过管道将输出传输到grep,如下所示: find . -maxdepth 1 -type f -print0 | grep "^\." 但它似乎不起作用。-> Binary file (standard input) match

我希望创建一个bash函数来过滤所选目录中的所有点文件(没有目录)。我只需要文件名,不需要完整路径

目前,我只有以下命令:

find . -maxdepth 1 -type f -print0
它打印除目录之外的所有文件。现在我仍然需要排除非dot文件。因此,我尝试通过管道将输出传输到grep,如下所示:

find . -maxdepth 1 -type f -print0 | grep "^\."
但它似乎不起作用。->

Binary file (standard input) matches
你们有一个优雅的解决方案吗


谢谢

如果只需要点文件:

find . -maxdepth 1 -type f -name '.*' -printf '%f\0'
测试
-name.*.
选择点文件。由于
-name
接受globs,
表示文字句点,
*
表示任何字符的任何数字

操作
-printf“%f\0”
将打印不带路径的NUL分隔文件名

如果名称选择条件变得更复杂,find还提供了基于正则表达式选择文件的
-regex
。GNUFind理解正则表达式的几种不同方言。可以使用
-regextype
选择这些选项。支持的方言包括
emacs
(默认)、
posix awk
posix basic
posix egrep
posix extended

Mac OSX或其他BSD系统 BSD
find
不提供
-printf
。取而代之的是,尝试以下方法:

find . -maxdepth 1 -type f -name '.*' -exec basename {} \;
请注意,这对所有文件名都是安全的,即使是包含空格、制表符或换行符等困难字符的文件名

将点文件放入bash数组 如果要将所有点文件和目录放入一个数组中,很简单:

all=(.*).
这对所有文件名都是安全的

如果只想获取常规文件,而不是目录,请使用bash:

a=(); while IFS= read -r -d ''; do a+=("$(basename "$REPLY")"); done < <( find $HOME -maxdepth 1 -type f -name '.*' -print0 )

a=();而IFS=read-r-d';做一个+=(“$(basename“$REPLY”)”);完成<获取所有隐藏文件以及完整路径

find . -type f -name '.*'
仅获取隐藏文件的文件名:

for f in `find . -type f -name '.*'`; do basename "$f"; done
但是,由于文件名可以包含空格(空格、制表符、换行符),因此使用以下名称更安全:

find . -type f -name '.*' -print0 | while IFS= read -r -d '' f; do basename "$f"; done

您还可以使用bash globbing/模式匹配:

for f in .[^.]*; do
    [ -f "$f" ] && echo "$f"
done

[^.]
是一个否定表达式,用于避免匹配
(当前工作目录)或
(父目录)。

尝试更改命令以查找-maxdepth 1-键入f-print0 | grep-a“^\”是否只希望文件名以点开头?谢谢!如果我直接在目录中运行该命令,它就会工作。但是我想做的是能够给这个命令分配一个运行搜索的路径。。。类似于:find$HOME-maxdepth 1-typef-print0 | grep-a“^\”。OP提到只需要文件名,而不需要完整路径。您可以通过使用
-printf“%f\0”
而不是
-print0
来实现这一点。我尝试了您的-printf解决方案,看起来
find
命令不知道-printf:find:-printf:unknown primary或operator@JeanmichelCote好啊您使用的是什么操作系统?@JeanmichelCote-Answer更新了一些应该与OSX(BSD)兼容的内容。另外,忽略关于
-regextype
的部分,因为OSX查找不支持它。@John1024工作正常!哼,这不行。它冻结外壳并且从不返回任何内容。冻结很可能是因为test
-maxdepth 1
丢失,所以
find
搜索整个目录树。现在可以正常工作了。我从这个答案中得到了最好的结果,并添加了-maxdepth 1选项。除此之外,我还可以使用
$HOME
变量代替
。但我在某个地方读到过这样一个错误的做法,即从安全角度来看,使用
*
@user2182349进行搜索,我在您的答案中添加了一个对所有文件名都安全的循环方法版本。(如果你不喜欢,请随时回复。)@John1024-谢谢!