如何遍历文件每行并以此为条件匹配遍历目标子目录?
我来给你几个快速解决的实用办法,都是shell环境里常用的技巧,挑你顺手的用就行:
方法1:逐行读取目标文件,精准匹配目录
假设你的目录名清单文件叫target_dirs.txt,用while循环逐行读取里面的目录名,同时检查这个目录是否真的存在,确认后再执行进入操作:
while IFS= read -r dir_name; do # 先验证目录是否存在且是合法子目录 if [ -d "$dir_name" ]; then echo "正在处理目录: $dir_name" # 这里替换成你要在目录内执行的实际命令 # 示例:进入目录做操作后返回原目录 cd "$dir_name" && echo "当前路径: $(pwd)" && cd .. # 如果需要进入该目录开启交互会话,用这条: # bash --init-file <(echo "cd $dir_name") fi done < target_dirs.txt
小提示:IFS=和-r是为了兼容带空格、特殊字符的目录名,避免读取时出错;-d "$dir_name"用来确保路径是真实存在的目录。
方法2:用grep批量筛选匹配目录
如果想一次性筛选出所有匹配的子目录再批量处理,可以用grep结合xargs:
ls -d */ | grep -xFf target_dirs.txt | xargs -I {} bash -c 'cd "{}" && echo "处理目录: $(pwd)" && cd ..'
拆解一下逻辑:
ls -d */:列出当前目录下所有子目录(末尾带/)grep -xFf target_dirs.txt:-x确保整行匹配,-F把目录名当作纯文本(避免正则特殊字符干扰),-f从目标文件读取匹配规则xargs -I {}:把每个匹配到的目录替换成{},然后执行后续的bash命令
注意事项
- 不管用哪种方法,一定要用双引号包裹目录变量,不然遇到带空格、
&、*这类特殊字符的目录会出错; - 测试阶段可以把实际操作换成
echo,先确认匹配的目录是对的,再执行真实命令,避免误操作; - 如果只是想逐个进入目录手动操作,方法1里的
bash --init-file <(echo "cd $dir_name")会给每个目录打开新的bash会话,退出后自动回到原目录。
内容的提问来源于stack exchange,提问作者Tanmoy Chakraborty
相关产品推荐
相关产品推荐

