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

时间:2012-06-04 01:22:11

标签: bash ubuntu

我正在尝试使用Ubuntu中的BASH复制一系列文件和文件夹。按字母顺序复制文件非常重要,因为它们位于数字相框中,按照添加到闪存驱动器的顺序读取文件。根据我的发现,Nautilus根据inode编号复制它们,因此它们最终会出现在相框上。

从我的搜索结果来看,我已经提出了以下命令:

for i in "$(find * -type f -print0 | sort)"; do cp -v "$i" "/media/PicFrame/$i"; done

导致文件名太长的错误。似乎BASH正在尝试创建一个文件,每个文件名用“\ n”分隔。我尝试删除一些引号,但在尝试复制文件名时会导致几个“无法统计”错误(因为很多文件名都有空格)。

有关如何使这项工作的任何想法?我对其他方法持开放态度,但我真的希望这是一个单一的命令/脚本,每个月我都可以在更换图片时运行。 (我一直在Windows中这样做,但我现在正试图在Ubuntu中做所有事情。我已经来回两年了。)

2 个答案:

答案 0 :(得分:2)

read循环中使用while代替。

find ... | while read file
do
  cp ..."$file"...
done

您可能需要考虑使用rsync代替。

答案 1 :(得分:2)

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

如果您不需要递归(您的文件都在一个目录级别),您可以使用带有globbing的for循环。使用此技术时,您不需要使用sort,因为保证了glob可以按字典顺序扩展为您的语言环境(换言之,“已排序”)。

for file in *
do
    cp "$file" dest
done

您应该注意,问题中脚本的部分问题在于您使用print0find的输出传输到sort。为了完成这项工作,如果您的版本有sort,则需要find ... -print0 | sort --files0-from=- 的适当选项。

{{1}}