Bash环境下如何遍历目录文件?for循环执行命令写法咨询
在Bash中遍历指定目录文件及执行命令的方法
嘿,我来帮你梳理下Bash里处理目录文件遍历的常用方案,还有怎么结合循环对文件执行命令~
一、遍历指定目录下的文件
1. 基础遍历(不含隐藏文件)
最直接的就是用for循环配合通配符*,比如遍历当前目录下的所有文件(包括子目录,如果你只想看普通文件可以加判断,后面会说):
for file in *; do echo "找到文件/目录: $file" done
如果要指定某个目录,直接把路径加上就行:
# 遍历 /home/user/docs 目录下的所有条目 for file in /home/user/docs/*; do echo "$file" done
⚠️ 重要提醒:如果文件名里有空格、特殊字符,一定要用双引号包裹$file,否则Bash会把空格当成分隔符,把一个文件名拆成多个参数,导致错误。
2. 包含隐藏文件的遍历
默认*不会匹配以.开头的隐藏文件,如果你需要包含它们,可以开启dotglob选项:
# 开启匹配隐藏文件的选项 shopt -s dotglob for file in /home/user/docs/*; do echo "$file" done # 用完可以关闭选项,恢复默认行为 shopt -u dotglob
3. 递归遍历子目录里的文件
如果要连子目录里的文件一起遍历,可以开启globstar选项:
shopt -s globstar # ** 表示匹配所有子目录层级 for file in /home/user/docs/**/*; do # 只输出普通文件,排除子目录 if [ -f "$file" ]; then echo "$file" fi done shopt -u globstar
二、遍历文件并执行命令
1. 对每个文件执行简单命令
比如我们想给每个普通文件生成MD5哈希值,可以这么写:
target_dir="/home/user/docs" for file in "$target_dir"/*; do # 先判断是不是普通文件,避免处理子目录 if [ -f "$file" ]; then md5sum "$file" fi done
2. 执行复杂多步操作
如果需要对文件做一系列处理,比如复制到指定目录并重命名,示例如下:
source_dir="/home/user/photos" dest_dir="/home/user/photos/backup" # 先确保目标目录存在 mkdir -p "$dest_dir" for file in "$source_dir"/*; do if [ -f "$file" ]; then # 获取文件名(不带路径) filename=$(basename "$file") # 复制文件并添加日期前缀 cp "$file" "$dest_dir/$(date +%Y%m%d)_$filename" echo "已备份文件: $filename" fi done
3. 用find配合exec(更灵活的递归处理)
如果需要递归遍历子目录,find命令往往比for循环更方便,比如给所有.txt文件添加后缀:
# 递归找到所有 .txt 文件,并重命名为 .txt.bak find /home/user/docs -type f -name "*.txt" -exec mv {} {}.bak \;
这里的{}会被替换成每个找到的文件路径,\;表示每个文件单独执行一次命令。如果想批量处理(比如多个文件一起传参),可以用+代替\;,效率更高:
# 批量查看所有 .txt 文件的详情 find /home/user/docs -type f -name "*.txt" -exec ls -l {} +
内容的提问来源于stack exchange,提问作者graycloud
相关产品推荐
相关产品推荐

