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

在BASH Ubuntu中按字母顺序复制文件夹中的文件,bash,ubuntu,Bash,Ubuntu,我试图在Ubuntu中使用BASH复制一系列文件和文件夹。按字母顺序复制文件是很重要的,因为这些文件放在数字相框中,该相框按照文件添加到闪存驱动器的顺序读取文件。据我所知,鹦鹉螺是根据inode编号复制它们的,因此它们在相框上的顺序会出现问题 通过搜索,我得到了以下命令: for i in "$(find * -type f -print0 | sort)"; do cp -v "$i" "/media/PicFrame/$i"; done 这将导致文件名过长的错误。BASH似乎试图创建一个文

我试图在Ubuntu中使用BASH复制一系列文件和文件夹。按字母顺序复制文件是很重要的,因为这些文件放在数字相框中,该相框按照文件添加到闪存驱动器的顺序读取文件。据我所知,鹦鹉螺是根据inode编号复制它们的,因此它们在相框上的顺序会出现问题

通过搜索,我得到了以下命令:

for i in "$(find * -type f -print0 | sort)"; do cp -v "$i" "/media/PicFrame/$i"; done
这将导致文件名过长的错误。BASH似乎试图创建一个文件,每个文件名之间用\n分隔。我已经尝试删除了一些引号,但在尝试复制文件名时会出现一些无法统计的错误,因为其中许多文件中都有空格

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

改用while循环阅读

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

您可能想考虑使用RSYNC。但是

< P>使用“while while循环”。

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

您可能想考虑使用RSYNC。但是,正如伊格纳西奥提到的,

< P>,如果使用find,应该使用一个读读循环。 如果您不需要递归,您的文件都在一个目录级别,您可以使用for循环和globbing。当使用这种技术时,您不需要使用sort,因为glob保证按照您的语言环境的字典顺序展开,换句话说,就是sorted

for file in *
do
    cp "$file" dest
done
您应该注意到,问题中脚本的部分问题是您使用print0将find的输出通过管道传输到sort。为了完成这项工作,您需要选择适当的选项来排序(如果您的版本有)

find ... -print0 | sort --files0-from=-

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

如果您不需要递归,您的文件都在一个目录级别,您可以使用for循环和globbing。当使用这种技术时,您不需要使用sort,因为glob保证按照您的语言环境的字典顺序展开,换句话说,就是sorted

for file in *
do
    cp "$file" dest
done
您应该注意到,问题中脚本的部分问题是您使用print0将find的输出通过管道传输到sort。为了完成这项工作,您需要选择适当的选项来排序(如果您的版本有)

find ... -print0 | sort --files0-from=-

亲爱的,rsync看起来正是我需要的。谢谢另外,对于前者,他必须将-print0从find@mVChr:或添加-files0 from=-进行排序,如果他的版本支持它,很可能是因为他使用的是Ubuntu.Sweet,rsync看起来正是我所需要的。谢谢另外,对于前者,他必须将-print0从find@mVChr:或添加-files0 from=-进行排序,如果他的版本支持,很可能是因为他使用的是Ubuntu。