KentY
2015-01-09 17:27:53 +08:00
## quick and dirty
find or ls...|awk 'NR%100==1{t="/dest"++i}$0="mv " $0 " " t'|sh
- 假设你那些文件用ls/find找到
- 去掉最后的`|sh`可以显示生成的mv命令,并不执行
- 这个会mv你那些文件到dest1-dest1000目录。
用seq模拟下10个文件,每2个存到相应目录:
kent$ seq -f "%g.txt" 10|awk 'NR%2==1{t="/dest"++i}$0="mv " $0 " " t'
mv 1.txt /dest1
mv 2.txt /dest1
mv 3.txt /dest2
mv 4.txt /dest2
mv 5.txt /dest3
mv 6.txt /dest3
mv 7.txt /dest4
mv 8.txt /dest4
mv 9.txt /dest5
mv 10.txt /dest5
##Better version
前面那个quick and dirty, dirty在于,很多写死的东西,而且文件名有空格什么的会有问题,这个比上一个文件长,但是好一些,也一行:
...|awk -v q='"' -v dest="/dest" -v g="100" 'NR%g==1{t=dest"" ++i}{printf "mv %s %s\n", q$0q,q t q}'|sh
这个`dest` 参数可以制定,每多少个`g`参数也是活的,文件名都用引号括了,同样用seq模拟:
kent$ seq -f "%g.txt" 10|awk -v q='"' -v dest="/dest" -v g="2" 'NR%g==1{t=dest"" ++i}{printf "mv %s %s\n", q$0q,q t q}'
mv "1.txt" "/dest1"
mv "2.txt" "/dest1"
mv "3.txt" "/dest2"
mv "4.txt" "/dest2"
mv "5.txt" "/dest3"
mv "6.txt" "/dest3"
mv "7.txt" "/dest4"
mv "8.txt" "/dest4"
mv "9.txt" "/dest5"
mv "10.txt" "/dest5"