当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 6 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 路径中含有空格带来的问题
帖子发表于 : 2008-11-02 22:49 

注册: 2007-10-05 10:21
帖子: 14
送出感谢: 0 次
接收感谢: 0 次
小弟刚学bash,想小试牛刀。我今天想将一个文件夹(包括子目录)里面的所有.h文件(有重复)拷贝到一个专用的目录,比如这样:
/a.h
/test/b.h
/test/dirA\a.h
/test/dirB blank\b.h
拷贝规则是保留最后的修改的那份。
我写了一个脚本:
#/bin/bash

rm ../sort -r -f
mkdir ../sort
for filetype in "*.h" "*.cpp" "*.dfm" "*.bpr"; do
echo "File type is $filetype"
lst=`find . -iname $filetype`
for onefile in $lst; do
echo "File name : $onefile"
dst="../sort/`basename $onefile`"
if [ -e $dst ] ; then
{
echo "---- Skipping file $onefile"
}
else
{
echo "++++ Copying file $ $onefile to $dst"
cp $onefile $dst
}
fi
done
done
结果很多空格的路径没法复制,通过echo的输出可以看到空格被截断了。给find前后`号后加上"也不管用。
我的思路是将查找到的文件的每一行抽取出来当成参数。
我先这样做了个测试:
#/bin/bash
for onefile in `find . -iname *.h`; do
echo "File name: $onefile"
done
有空个的地方就被输出成两个了,
然后我查阅了一些资料,加了双引号:
#/bin/bash
for onefile in "`find . -iname *.h`"; do
echo "File name: $onefile"
done
但只是输出了一个File name,不符合要求。
我想,给每一个文件名加上前后的双引号应该就可以,我测试了以下:
find . -iname *.h -printf "\"%h%f\"\n"能够输出带双引号的路径
但是,用在这里:
#/bin/bash
for onefile in `find . -iname *.h -printf "\"%h%f\"\n"`; do
echo "File name: $onefile"
done
还是在有空格的地方被截断了。
应该怎么修改才能适应这样的情况呢?
谢谢大家~~


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 路径中含有空格带来的问题
帖子发表于 : 2008-11-02 22:58 

注册: 2007-03-07 19:07
帖子: 28
送出感谢: 0 次
接收感谢: 0 次
$> find path -name *.h -exec cp {} . \;


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 路径中含有空格带来的问题
帖子发表于 : 2008-11-02 23:00 

注册: 2007-10-05 10:21
帖子: 14
送出感谢: 0 次
接收感谢: 0 次
xihe 写道:
$> find path -name *.h -exec cp {} . \;

但我还要按照一定的规则,就是保留修改时间最靠后的文件。我在想exec里面能不能跟一个脚本哦~~里面加一个判断~~


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 路径中含有空格带来的问题
帖子发表于 : 2008-11-03 10:44 
头像

注册: 2007-12-25 12:51
帖子: 231
送出感谢: 0 次
接收感谢: 0 次
代码:
export IFS=$'\n'
for f in `find . -iname '*.h'`; do
    echo "f is $f"
done


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 路径中含有空格带来的问题
帖子发表于 : 2008-11-03 10:50 
头像

注册: 2006-04-12 20:05
帖子: 8495
地址: 杭州
送出感谢: 0 次
接收感谢: 8
多用双引号 :em05


_________________
关注我的blog: ε==3


页首
 用户资料  
 
6 楼 
 文章标题 : Re: 路径中含有空格带来的问题
帖子发表于 : 2008-11-04 9:15 

注册: 2007-10-05 10:21
帖子: 14
送出感谢: 0 次
接收感谢: 0 次
c\nc 写道:
代码:
export IFS=$'\n'
for f in `find . -iname '*.h'`; do
    echo "f is $f"
done

明白了:
IFS 定义SHELL使用的分隔符

谢谢!


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 6 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译