2

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

从我所做的搜索中,我想出了以下命令:

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

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

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

4

2 回答 2

3

read而是在while循环中使用。

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

不过,您可能要考虑使用rsync

于 2012-06-04T01:25:28.457 回答
2

正如 Ignacio 所提到的,while read如果您使用find.

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

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

您应该注意,您问题中脚本的部分问题是您正在使用print0管道输出findinto sort。为了进行这项工作,您将需要适当的选项来sort确定您的版本是否具有它。

find ... -print0 | sort --files0-from=-
于 2012-06-04T01:39:40.150 回答