我有一个循环,它遍历一系列文本文件(所有文件的形式都是name.txt
(:
for txt in *txt; do
sed -i '$ d' $txt
done
但是每当目录中没有.txt
文件时,我都会收到以下错误消息:
sed:无法读取"*txt":没有这样的文件或目录
您可以通过两种方式解决此问题:
a( 在对文件执行任何操作之前检查文件是否存在
for txt in *txt; do
[[ -f "$txt" ]] || continue # skip if file doesn't exist or if it isn't a regular file
# your logic here
done
b( 使用 shell 选项shopt -s nullglob
这将确保 glob 在没有匹配文件时扩展到无
shopt -s nullglob
for txt in *txt; do
# your logic here
done
另请参阅:
- 为什么默认情况下不设置空球
这是因为它不匹配任何文件并且离开了"txt",而不是做你期望的事情,即跳过for循环。在某些实现(例如 macOS(上,它会将字符串保留为"*txt",并在变量 txt 设置为 *txt 的情况下运行 for 循环。在尝试运行 for 循环之前,您需要先测试文件模式是否存在。请参阅检查 shell 脚本中是否存在带有通配符的文件。