递归查找具有特定扩展名的文件
- 2024-10-25 08:42:00
- admin 原创
- 53
问题描述:
我正在尝试使用我的 Bash( Ubuntu 10.04 LTS(Lucid Lynx)版本)在目录及其子目录中查找具有特定扩展名的所有文件。
这是脚本文件中写的内容:
#!/bin/bash
directory="/home/flip/Desktop"
suffix="in"
browsefolders ()
for i in "$1"/*;
do
echo "dir :$directory"
echo "filename: $i"
# echo ${i#*.}
extension=`echo "$i" | cut -d'.' -f2`
echo "Erweiterung $extension"
if [ -f "$i" ]; then
if [ $extension == $suffix ]; then
echo "$i ends with $in"
else
echo "$i does NOT end with $in"
fi
elif [ -d "$i" ]; then
browsefolders "$i"
fi
done
}
browsefolders "$directory"
不幸的是,当我在终端启动这个脚本时,它显示:
[: 29: in: unexpected operator
(用$extension
代替'in'
)
这是怎么回事?错误在哪里?但是这个花括号。
解决方案 1:
find "$directory" -type f -name "*.in"
比整个内容要短一些(并且更安全。它处理文件名和目录名中的空格)。
.
您的脚本可能会因名称中没有 的条目而失败,从而导致条目$extension
为空。
解决方案 2:
find {directory} -type f -name '*.extension'
示例:要查找csv
当前目录及其子目录中的所有文件,请使用:
find . -type f -name '*.csv'
解决方案 3:
我使用的语法与Mat 建议的略有不同:
find $directory -type f -name *.in
(减少了一次击键)。
解决方案 4:
不使用find:
du -a $directory | awk '{print $2}' | grep '.in$'
解决方案 5:
使用:
find "$PWD" -type f -name "*.in"
解决方案 6:
虽然使用find
命令在这里很有用,但 shell 本身提供了实现此要求的选项,无需任何第三方工具。shellbash
提供了一个扩展的 glob 支持选项,您可以使用它来获取与所需扩展名匹配的递归路径下的文件名。
扩展选项是extglob
需要使用shopt
以下选项设置的。选项通过支持启用-s
,通过 he-u
标志禁用。此外,您还可以使用更多选项,即nullglob
完全清除不匹配的 glob,用一组零字替换。globstar
这允许递归遍历所有目录
shopt -s extglob nullglob globstar
现在您需要做的就是形成 glob 表达式以包含特定扩展名的文件,您可以按如下方式执行。我们使用数组来填充 glob 结果,因为当正确引用和扩展时,带有特殊字符的文件名将保持完整,不会因 shell 的分词而被破坏。
例如列出*.csv
递归路径中的所有文件
fileList=(**/*.csv)
该选项**
是递归遍历子文件夹,并*.csv
进行全局扩展以包含所提及扩展名的任何文件。现在要打印实际文件,只需执行
printf '%s
' "${fileList[@]}"
在 shell 脚本中使用数组并进行适当的引用扩展是正确的方法,但对于交互式使用,您可以简单地使用ls
glob 表达式
ls -1 -- **/*.csv
这可以很好地扩展以匹配多个文件,即以多个扩展名结尾的文件(即类似于在find
命令中添加多个标志)。例如,考虑需要获取所有递归图像文件(即扩展名为和)的情况*.gif
,您需要做的就是*.png
`*.jpg`
ls -1 -- **/+(*.jpg|*.gif|*.png)
这也可以很好地扩展为得到否定结果。使用相同的语法,可以使用 glob 的结果来排除某些类型的文件。假设您想排除具有上述扩展名的文件名,您可以这样做
excludeResults=()
excludeResults=(**/!(*.jpg|*.gif|*.png))
printf '%s
' "${excludeResults[@]}"
该构造!()
是一个否定操作,不包括里面列出的任何文件扩展名,并且|
是一个交替运算符,就像在扩展正则表达式库中用来对 glob 进行 OR 匹配一样。
请注意,这些扩展的 glob 支持在 POSIX Bourne Shell 中不可用,并且它仅特定于 的最新版本bash
。因此,如果您正在考虑跨 POSIX 和 Shell 运行的脚本的可移植性bash
,则此选项不合适。
解决方案 7:
{
后面缺少browsefolders ()
一切都
$in
应该$suffix
行
cut
只显示 的中间部分front.middle.extension
。您应该阅读 shell 手册中的${varname%%pattern}
和 的相关内容。
我假设您将此作为 shell 脚本练习,否则find
已经提出的解决方案就是可行的方法。
要检查 shell 语法是否正确(无需运行脚本),请使用sh -n scriptname
。
解决方案 8:
要查找pom.xml
当前目录中的所有文件并打印它们,您可以使用:
find . -name 'pom.xml' -print
解决方案 9:
使用:
find $directory -type f -name "*.in" | grep $substring
解决方案 10:
for file in "${LOCATION_VAR}"/*.zip
do
echo "$file"
done
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件