Linux中用for遍历目录文件,应使用未加引号的通配符如for file in *; do echo "$file"; done,避免空格问题需配合IFS或find;含空格时推荐find ... -print0 | while IFS= read -r -d '' file。

在 Linux 中用 for 遍历目录下的文件,核心是让循环变量依次取到每个文件名。关键在于写对循环的“列表部分”,避免空格、换行或特殊字符导致出错。
基础写法:直接展开通配符
最常用也最安全的方式是利用 shell 的路径展开(glob):
-
for file in *; do echo "$file"; done—— 遍历当前目录所有非隐藏文件 -
for file in *.txt; do echo "$file"; done—— 只遍历 .txt 文件 -
for file in /path/to/dir/*; do echo "$file"; done—— 遍历指定目录
注意:* 在双引号外才会被 shell 展开;加引号(如 "*")会当成字面量,起不到遍历作用。
处理含空格或特殊字符的文件名
如果文件名含空格、换行或括号等,单纯用 for file in * 可能断裂。稳妥做法是配合 find + while read,但若坚持用 for,可临时改分隔符:
IFS=$'\n'; for file in $(ls -A); do echo "$file"; done; IFS=$' \t\n'- 说明:
ls -A列出所有文件(含隐藏),IFS=$'\n'让 shell 按换行切分,避免空格干扰 - ⚠️ 注意:这种方法仍不完美,遇到含换行符的文件名仍有风险;生产环境推荐用
find ... -print0 | while IFS= read -r -d '' file
跳过子目录,只处理普通文件
默认 * 会匹配目录和文件。如只需普通文件,可在循环体内加判断:
for file in *; do [ -f "$file" ] && echo "$file"; done-
[ -f "$file" ]是测试是否为普通文件(不是目录、链接等) - 加上引号
"$file"防止文件名含空格时报错
常见错误提醒
以下写法容易出问题,需避免:
-
for file in "$(ls)"; do ...——$(ls)把所有文件名压成一行字符串,for只循环一次 -
for file in "*.log"; do ...—— 星号被引号包裹,不会展开,实际循环的是字面量*.log -
for file in $(ls *.log); do ...—— 若文件名含空格,会被拆成多个词,导致误判


















