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