shell遍历目录时候的空格处理问题
之前说过 用find的-print0和xargs的-0参数可以很好的处理目录空格问题,但是xargs要实现复杂的指令就有点困难了,难道一定要外部执行一个脚本么。
比如我需要处理一个目录下的如下文件
# tree
.
├── aa bb
│ └── a b.txt
├── cc dd
│ ├── jjll.txt
│ └── qq mm.txt
└── eeff
├── hi hi.txt
└── hi.txt
3 directories, 5 files
cat其内容进行grep筛选后写入该目录类以源文件名加YD后缀的新文件名内
尝试用for 循环实现
for files in `find ./ -type f -name "*.txt"` do echo $files done
结果给出了这样的输出
./aa bb/a b.txt ./cc dd/jjll.txt ./cc dd/qq mm.txt ./eeff/hi.txt ./eeff/hi hi.txt
可见for把空格认为是换行 导致都位了
网上搜索了下,说是要修改IFS
old_IFS=$IFS IFS=$(echo -en "\n\b") for files in `find ./ -type f -name "*.txt"` do echo $files done #用完恢复老的IFS IFS=$old_IFS
测试了一下 果然可以了
\b指光标回退一格
自己用while read实现了一个 也可以的
find ./ -type f -name "*.txt" |while read line;
do
#for Debug
echo $line
cat "$line" |grep -P '^(13[5-9])|(^18[7|8])|(^15[0-2])|(^182)|(^15[8|9])' >"${line}_YD.txt"
done
实例 批量解压当前目录的rar文件到同名文件夹中
find ./ -type f -name "*.rar" |while read line;
do line=`basename $line`;
mkdir ${line%.*};
unrar x ${line%.*}.rar ${line%.*};
done


不是太懂这个~