我正在尝试使用Ubuntu中的BASH复制一系列文件和文件夹。按字母顺序复制文件非常重要,因为它们位于数字相框中,按照添加到闪存驱动器的顺序读取文件。根据我的发现,Nautilus根据inode编号复制它们,因此它们最终会出现在相框上。
从我的搜索结果来看,我已经提出了以下命令:
for i in "$(find * -type f -print0 | sort)"; do cp -v "$i" "/media/PicFrame/$i"; done
导致文件名太长的错误。似乎BASH正在尝试创建一个文件,每个文件名用“\ n”分隔。我尝试删除一些引号,但在尝试复制文件名时会导致几个“无法统计”错误(因为很多文件名都有空格)。
有关如何使这项工作的任何想法?我对其他方法持开放态度,但我真的希望这是一个单一的命令/脚本,每个月我都可以在更换图片时运行。 (我一直在Windows中这样做,但我现在正试图在Ubuntu中做所有事情。我已经来回两年了。)
答案 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
您应该注意,问题中脚本的部分问题在于您使用print0
将find
的输出传输到sort
。为了完成这项工作,如果您的版本有sort
,则需要find ... -print0 | sort --files0-from=-
的适当选项。
{{1}}