我有一个目录,其中有多个子目录。我正在一个一个地循环子目录。然后我使用 cd 更改目录。如果在该子目录中,我有一个扩展名为 .partial 的文件,请保存文件名。然后我需要打印子目录名和部分文件名。我写了这样的东西
for f in *
do
if [ -d "$f" ]; then
cd "$f"
a=$(find ./ -name "*.partial")
if [ -e "$a" ];then
echo -e "$f" "\t" "$a"
fi
cd ..
fi
done
问题find
在于它递归地.partial
在其他子目录中查找文件扩展名,这是我不想要的。如何将其限制为仅当前目录?
仅输出每个
.partial
文件相对于当前目录的完整路径名:如果没有匹配项(仍然会输出一个空行),设置
nullglob
shell 选项将使其不输出模式本身,并且设置将额外匹配隐藏名称。bash
dotglob
以下将这些路径名拆分为目录路径和文件名部分:
这将打印在当前目录的任何子目录中找到
.partial
的每个名称的子目录名称和文件名。.partial
在中,如果您还需要能够匹配隐藏名称
bash
,您可能还需要设置 shell 选项。dotglob
这两个参数替换可以通过调用
dirname
和来代替basename
:上面的一个变体,只打印一次子目录名称(这需要一个类似
bash
shell 的${*%%*/}
参数扩展,它删除目录路径并保留文件名,对于每个位置参数):这会遍历每个子目录并扩展每个子目录中的通
*.partial
配模式。如果第一个匹配是一个常规文件(或一个链接),则打印子目录名称,后跟与该模式匹配的名称,并删除目录路径。该
find
实用程序支持该选项-maxdepth
要限制
find
到指定目录,可以添加选项-maxdepth 1
.如果您尝试列出
*.partial
深度 2 的所有常规文件,其输出类似于您的问题,您可以尝试如下命令这可能会产生类似于
如果你有 GNU
find
,你可以做这样的事情如果您没有 GNU ,则可以以牺牲一些效率为代价
find
来模拟GNU,就像这样-printf '%f\n'
这两种解决方案都不能处理带有换行符或奇怪打印字符的文件,但是如果您在单行的目录中列出文件,我希望您不会有奇怪的文件名。如果您有一个不理解的外壳,
[[ ... ]]
只需将双括号替换为单括号,[ ... ]
.