ls 查找目录中具有特定名称的文件,但 find 不查找

ls 查找目录中具有特定名称的文件,但 find 不查找

我正在尝试查找名称以80s.

ls 80s*/*找到正确的文件,但find . -ipath '80s*/*'不返回任何内容。find此任务的正确命令是什么?

我需要使用,find因为我想将所有此类文件移动到不同的文件夹并且不想解析ls.

答案1

-ipath匹配完整路径名,包括当前路径.。所以你必须将其包含在你的模式中:

find . -ipath './80s*/*'

上面也将输出目录。要仅列出常规文件,请使用:

find . -ipath './80s*' -type f

(或者! -type d对于除目录之外的任何类型的文件)

答案2

如果,正如你所说,80s*/*匹配正确的文件,那么我根本看不出使用的理由find

要将所有匹配的名称移动80s*/*到某个目标目录,destdir您可以使用

mv -n 80s*/* destdir/

这会将所有非隐藏名称从任何匹配的目录移动80s*到单个目录中destdir。非标准-n选项通常意味着“无破坏”,即如果存在名称冲突,则不覆盖文件。

如果使用 GNU ,您还可以使用选项(例如)或如上所述的()mv来避免覆盖与其他文件同名的文件。--backup--backup=numbered-n--no-clobber

如果您只需要挑选常规的文件,或者如果80s*/*扩展到太长的名称列表,请使用循环:

for name in 80s*/*; do
    [ ! -f "$name" ] && continue
    mv -n "$name" destdir/
done

(这也会将符号链接移动到常规文件。为了避免这些情况,请另外使用-h/测试-L是否"$name"是符号链接。)

zshshell 中,您可以使用以下命令移动与您的模式匹配的所有常规文件

mv -n 80s*/*(.) destdir/

...其中 glob 限定符(.)过滤前面模式的结果以仅包含常规文件((-.)还包括常规文件的符号链接)。


如果你确实需要使用的话find,再考虑一下

find ./80s*/ -path './80s*/*' -prune ! -name '.*' -type f \
    -exec mv -n {} destdir/ \;

这匹配您感兴趣的名称,并避免隐藏名称(您说80s*/*匹配正确,我认为这意味着不需要隐藏名称)。它梅子所有匹配的名称,这意味着它避免输入与模式匹配的子目录,然后,如果名称对应于常规文件,则将文件移动到像以前一样destdir使用。mv -n

使用 GNU ,您可以通过使用代替原来的 来mv使其更加高效。这将批量执行找到的文件名,而不是为每个名称调用一次。-exec mv -n -t destdir/ {} +-execmvmv

相关内容