首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在BASH Ubuntu中按字母顺序复制文件夹中的文件

在BASH Ubuntu中按字母顺序复制文件夹中的文件
EN

Stack Overflow用户
提问于 2012-06-04 09:22:11
回答 2查看 3.2K关注 0票数 2

我正在尝试使用Ubuntu中的BASH复制一系列文件和文件夹。按字母顺序复制文件很重要,因为它们将放在数码相框中,该相框将按照文件添加到闪存驱动器的顺序读取文件。据我所知,Nautilus会根据inode编号复制它们,因此它们在图片帧上的顺序会打乱。

根据我所做的搜索,我想出了以下命令:

代码语言:javascript
复制
for i in "$(find * -type f -print0 | sort)"; do cp -v "$i" "/media/PicFrame/$i"; done

这会导致文件名过长的错误。BASH似乎正在尝试创建一个每个文件名都用"\n“分隔的文件。我尝试删除一些引号,但这导致在尝试复制文件名片段时出现几个"cannot stat“错误(因为许多文件名中有空格)。

有没有关于如何让它工作的想法?我对其他方法持开放态度,但我真的希望这是一个单独的命令/脚本,我可以在每个月更改图片时运行。(我一直在Windows上做这件事,但现在我正试着用Ubuntu做所有的事情。我已经来来回回大约两年了。)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-04 09:25:28

while循环中使用read

代码语言:javascript
复制
find ... | while read file
do
  cp ..."$file"...
done

不过,您可能希望考虑使用rsync

票数 3
EN

Stack Overflow用户

发布于 2012-06-04 09:39:40

正如Ignacio所提到的,如果您使用find,则应该使用while read循环。

如果您不需要递归(您的所有文件都在一个目录级别),您可以使用带有全局绑定的for循环。在使用这种技术时,您不需要使用sort,因为可以保证glob按照您所在地区的字典序(换句话说,“排序”)进行扩展。

代码语言:javascript
复制
for file in *
do
    cp "$file" dest
done

您应该注意到,问题中脚本的部分问题是您使用print0find的输出通过管道传输到sort。为了能够正常工作,您需要将适当的选项设置为sort (如果您的版本具有该选项)。

代码语言:javascript
复制
find ... -print0 | sort --files0-from=-
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10875363

复制
相关文章

相似问题

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