You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何打印目录中特定扩展名文件?现有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:50:32