find + xargs - 将文件从一个子目录移动到另一个子目录

find + xargs - 将文件从一个子目录移动到另一个子目录

我的文件夹结构如下:

/volume1
  /photoTest
    /folderA
      /@eaDir
      /eaDir_tmp 
    /folderB
      /@eaDir
      /eaDir_tmp 
    /folder with space
      /@eaDir
      /eaDir_tmp 

我想要做的是将文件从每个文件夹复制eaDir_tmp到各自的@eaDir文件夹中。

我能够通过以下方式实现它:

for a in $(find /volume1/photoTest -type d -name eaDir_tmp); do rsync -vhar --chmod=a+rwx $a/ $a/../@eaDir; done;

直到我点击了有空格的文件夹。上面的脚本简直是垃圾。

经过大量谷歌搜索后,我尝试:

find /volume1/photoTest -type d -name eaDir_tmp -print0 | xargs -0 rsync -vhra --chmod=a+rwx {} {}/../@eaDir

此命令的试运行没有问题。但打印此命令后实际运行会卡住。

sending incremental file list
@eaDir/subdir1/

并被卡在那里。

ps -elf | grep rsync显示一组 rsync 进程的开启情况waitpoll_s状态。

有人知道发生了什么吗?解决方案是什么?

更新:根据评论作出一些澄清:

  • 移动还是复制?好吧,最终目标是“移动”。但我也想知道如何复制。
  • 发生了什么事 - 是的,我想知道发生了什么事以及为什么我的命令没有按预期工作。我希望能学到一些东西,因为我不是普通的 Linux 用户。
  • 解决方案是什么?好吧,我也想知道。:)
  • 文件夹里有什么eaDir?更多文件夹,然后里面有一些文件。如果有帮助的话,整个事情都是从这个开始的:https://github.com/mbrrg/synology-thumbgen。作者建议删除现有@eaDir文件夹并简单地重命名eaDir_tmp。但我不能这样做,因为现有文件夹包含我想保留的文件。我可以解释,但我认为这会使问题更加混乱。
  • execdir有效 - 因为它不会说参数无效或抛出任何错误。但它没有达到目标 - 即正确复制文件。
  • 我的 有多丰富find?它位于我的 Synology NAS 中,我认为它正在运行 BusyBox?但不确定。我如何找出答案?
  • 如果目标文件存在,并且源文件较新,则我想覆盖它。否则不覆盖。

答案1

不确定为什么rsync会卡住。但我能够使用 2 个命令取得一些进展:

第一的,通过以下方式复制所有文件:

find /volume1/photo -type d -name eaDir_tmp -exec cp -a -t {}/../@eaDir {}/. \;

第二,更改文件权限:

find /volume1/photo -type d -name @eaDir -exec chmod 777 {} -R \;

这不仅笨拙且缓慢,而且感觉就像在处理 MS-DOS。Linux 专家在哪里?

相关内容