在下面的目录中,我想要嵌套在深度 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会强制模式仅扩展到目录(因为/
名称中不能包含非目录)。
使用zsh
shell,以下文件名通配模式将扩展为仅常规的每个子目录下的文件
*/*(.)
要对那些匹配的名称执行某些操作,您可以循环遍历该 glob 模式的扩展:
for pathname in */*(.); do
# use "$pathname" here
done
在bash
or中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
变体会跳过常规文件的符号链接并包含隐藏名称(设置dotglob
shell 选项以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 软件试图尽可能方便。