在编号目录中查找文件

在编号目录中查找文件

在下面的目录中,我想要嵌套在深度 1 的编号目录中的文件列表,在本例中为 6 到 11。

$ ls *
1.org   2.MOV  3.MOV  4-1.MOV  5-1.mp4  5-2.MOV  5-2.org~  9-2.MOV
1.org~  2.org  3.org  4-1.org  5-1.org  5-2.org  9-1.MOV

10:
10.mp4

11:
11.MOV

6:
6.mp4

7:
7.MOV

8:
8.MOV

例如,我要6.mp4返回,而不是2.MOV。第一次尝试(我知道它不完美,因为它遗漏了 10 11)。我尝试使用depth但存在位置问题。

$ find . -type f -path [^0-9]/* 
./11/11.MOV
./5-1.mp4
./5-1.org
./4-1.MOV
./10/10.mp4
./7/7.MOV
./2.org
./3.org
./2.MOV
./5-2.org
./3.MOV
./5-2.org~
./5-2.MOV
./1.org
./1.org~
./8/8.MOV
./4-1.org
./9-2.MOV
./9-1.MOV
./6/6.mp4

答案1

您之所以得到这些结果,是因为find查看当前目录中包含的所有内容,除非另有指定。如果您只想查看当前目录中名为 6-11 的编号目录内的文件,那么您所需要的就是:

由于没有 9,你可以使用这个:

find {6,7,8,10,11} -type f

这只会扩展包含的数字。

如果您有 6 到 11 之间的所有数字:

find {6..11} -type f

这只会在名为 6-11 的目录中查找并返回其中的文件。

如果这些是当前目录中唯一的目录(根据您的结果显示为如此),那么您也可以执行以下操作:

find . -mindepth 2 -type f

这将告诉它从当前目录下一层或两层深度开始。

答案2

ls */

这将列出当前目录中所有非隐藏子目录的内容。由于您似乎只有带有数字名称的子目录,因此这将显示这些子目录的内容。

shell 通配模式*将扩展到当前目录中的所有非隐藏名称。/在模式末尾添加 a会强制模式仅扩展到目录(因为/名称中不能包含非目录)。

使用zshshell,以下文件名通配模式将扩展为仅常规的每个子目录下的文件

*/*(.)

要对那些匹配的名称执行某些操作,您可以循环遍历该 glob 模式的扩展:

for pathname in */*(.); do
    # use "$pathname" here
done

bashor中sh,您可以调用一个小脚本find

find . -mindepth 2 -maxdepth 2 -type f -exec sh '
    for pathname do
        # use "$pathname" here
    done' sh {} +

但这确实只是一种奇特的写作方式

for pathname in */*; do
    [ ! -f "$pathname" ] && continue
    # use "$pathname" here
done

除了该find变体会跳过常规文件的符号链接并包含隐藏名称(设置dotglobshell 选项以bash包含这些名称)。

同样,这将执行您想要的操作(查看具有数字名称的目录),因为您似乎仅有的有带有数字名称的子目录。

假设可能还有其他子目录,

for pathname in */*; do
    [ ! -f "$pathname" ] && continue
    case $(dirname "$pathname") in
        *[!0-9]*) continue
    esac
    # use "$pathname" here
done

或者,与bash,

for pathname in */*; do
    if [ ! -f "$pathname" ] ||
       [[ $(dirname "$pathname") == *[!0-9]* ]]
    then
        continue
    fi
    # use "$pathname" here
done

这些循环将循环子目录中的所有名称,但会跳过不引用常规文件(或指向某个文件的符号链接)的任何名称,并且还会跳过子目录中名称包含非数字内容的任何文件。

使用extglob中的 shell 选项bash,您可以使其变得更短:

shopt -s exglob
for pathname in +([0-9])/*
    [ ! -f "$pathname" ] && continue
    # use "$pathname" here
done

该模式+([0-9)/将扩展到名称中仅包含数字的目录名称。zsh如果KSH_GLOB设置该选项而不是 ,这也将起作用extglob

使用 GNU find,您显然可以选择数字目录,然后循环遍历它们的内容:

find . -maxdepth 1 -type d -regex '.*/[0-9]+$' -exec sh '
    for dirpath do
        for pathname in "$dirpath"/*; do
            [ ! -f "$pathname" ] && continue
            # use "$pathname" here
        done
    done' sh +

但我通常不建议在文件名或目录名上使用正则表达式,因为它们主要用于匹配文本文件中的文本。 GNUfind显然支持用正则表达式匹配路径名,因为 GNU 软件试图尽可能方便。

相关内容