首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在bash脚本中正确地避开奇怪的字符?

如何在bash脚本中正确地避开奇怪的字符?
EN

Unix & Linux用户
提问于 2017-08-29 12:46:49
回答 1查看 1.4K关注 0票数 5

我不是专业的脚本编写或找到命令的任何时候(只是一个警告)。我正在尝试创建一个脚本,它可以将我所有的mp3播客移动到一个文件夹中,然后我可以移动到我的手机上。

所以我做的剧本需要移动所有的mp3's (甚至那些有奇怪的路径)。我创建了一个脚本,如下所示,它看起来是*按我的意愿执行,但是它总是给出如下错误:

代码语言:javascript
复制
find /home/jason/gPodder/ -name '*.mp3' -exec bash " cp '{}' /home/jason/gPodder/mp3/ " \;
Which returns:    
bash:  cp '/home/jason/gPodder/Downloads/The Documentary/TheDocumentary20170823-GoingGreenInTheOilState.mp3' /home/jason/gPodder/mp3/ : No such file or directory 

但是,如果我复制上述bash‘命令’,这是没有问题的。请你帮我理解一下脚本中的错误是什么。

谢谢

EN

回答 1

Unix & Linux用户

发布于 2017-08-29 20:53:57

其他人指出了引用和执行的问题。

我建议您不要使用find -exec,而是查找一个文件列表,然后将该列表输送到xargs和cp。使用print0选项可以帮助您绕过文件名和目录名中的任何“有趣”字符。

例如:

代码语言:javascript
复制
find sourcepath -name \*.mp3 -print0 \
    | xargs -0 cp -t destinationpath

这样做的好处是xargs将从find收集多个文件名,并同时将它们传递给cp,因此每个cp实例可以复制20或100个文件,而不是为每个文件启动1 cp调用。xargs将为您在cp命令行中提供足够的文件名。

您还可以向xargs添加-P n选项,它将并行启动多个cp进程。

基于您的文件与目标mp3文件夹位于同一个文件系统的基础上。您可以将-l添加到cp中,这样就可以将文件硬链接到目的地,而不是复制它们。

例如:

代码语言:javascript
复制
find sourcepath -name \*.mp3 -print0 \
    | xargs -0 -P 5 \
    cp -l -t destinationpath
票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/389056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档