如何打印目录中特定扩展名文件?现有Shell脚本失效求替代方案
解决打印当前目录特定扩展名文件的Shell脚本问题
先帮你拆解下原来脚本里的问题,再给你几个可行的解决方案:
首先看你写的这段脚本:
for i_dir in * do var=`find . -maxdepth 1 -mindepth 1 -name '$i_dir*.txt'` echo $var done
这里有几个关键错误导致它无法正常运行:
- for循环语法错误:
do必须和for的循环体用分号或者换行分隔,Shell会把没有分隔的do当成循环参数,直接报错。 - 单引号的变量解析问题:
'$i_dir*.txt'用了单引号,Shell不会解析里面的$i_dir变量,会把它当成纯字符串,所以find根本找不到匹配的文件。 - 逻辑冗余:外层的
for i_dir in *完全没必要——你本来就是要找当前目录下的.txt文件,直接用通配符或者find就能搞定,不需要多套一层循环。
接下来给你几个实用的解决方案,按需选择:
方案1:用find命令(精准控制)
如果你需要严格限制只在当前目录查找(不深入子目录),这条命令最直接:
find . -maxdepth 1 -mindepth 1 -type f -name "*.txt"
参数解释:
-type f:只匹配文件(如果需要包含带.txt后缀的目录可以去掉这个参数)"*.txt":用双引号包裹,避免Shell提前解析通配符(文件名含空格时更安全)-maxdepth 1:限制查找范围仅当前目录-mindepth 1:排除当前目录本身(.)
方案2:用Shell通配符(最简单)
如果你的Shell是bash/zsh这类常用版本,直接用通配符就能列出文件,比find更简洁:
echo *.txt
要是你需要逐个处理这些文件(比如后续要打印内容、复制等),可以用for循环:
for file in *.txt; do echo "$file" # 这里可以加其他操作,比如 lpr "$file" 直接打印文件 done
注意用双引号包裹$file,避免文件名里有空格时出现拆分错误。
方案3:修复你原来的脚本(仅作语法参考)
如果你一定要保留原来的思路,修复后的脚本是这样(但还是不推荐,因为逻辑冗余):
for i_dir in *; do var=$(find . -maxdepth 1 -mindepth 1 -name "${i_dir}*.txt") echo "$var" done
这里把反引号换成了$()(现代Shell推荐写法,可读性更强且支持嵌套),用双引号+大括号确保变量正常解析,同时补全了for循环的语法分隔符。
内容的提问来源于stack exchange,提问作者Tehniyat
相关产品推荐
相关产品推荐

