在子文件夹 shell 脚本中循环处理具有特定扩展名的文件

在子文件夹 shell 脚本中循环处理具有特定扩展名的文件

我的 mac 上有一个脚本,我试图在当前位置的子文件夹内的 txt 文件上循环。这是myscript.sh

cd /Users/Desktop/
for entry in $(pwd)/txt/*.txt 
do 
echo $entry
done

*txt这会打印包含在其中的路径字符串,就像/Users/Desktop/txt/*.txt我想在 .txt 文件上循环一样,所以我希望echo $entry打印 txt 文件的名称,但它却打印/Users/Desktop/txt/*.txt

答案1

当您为 shell 提供的通配模式与任何文件名都不匹配时,通配模式将不会扩展。在您的情况下,这意味着echo循环输出模式本身。

脚本的替代实现:

cd /Users/Desktop || exit 1

for entry in txt/*.txt; do 
    test -e "$entry" && echo "$entry"
done

如果失败,此实现将以非零退出代码退出cd。然后它会不是使用pwd,因为没有必要。它将获取与模式匹配的名称列表,并将迭代这些名称。在每次迭代中,它都会进行测试,以确保文件系统中确实存在具有该名称的内容,然后再将该名称输出到标准输出。

如果您希望echolop 内部输出文件的完整路径,请使用echo "/Users/Desktop/$entry",甚至更好:

dir="/Users/Desktop"
cd "$dir" || exit 1

for entry in txt/*.txt; do 
    test -e "$entry" && printf '%s/%s\n' "$dir" "$entry"
done

相关内容