繁体   English   中英

Bash脚本将最近修改的当前目录中的所有文件复制到其他地方新创建的文件夹中

[英]Bash script to copy all files in current directory modified recently into a newly created folder elsewhere

其他一些细节:

  • 我想首先在桌面上创建一个新目录。 目录名称将是当前日期和时间。
  • 我想将当前工作目录中最近20分钟内已修改的所有文件(递归)复制到该新文件夹中。
  • 最后,我正计划对此进行别名化,使其看起来像不是已知命令,因此我回显了一个伪造的“找不到命令”

这是我想出的:(全1行,为便于阅读而拆分)

mkdir ~/Desktop/$(date +%F-%T) 
&& find . -mmin -20 -exec cp -r {} ~/Desktop/$(date +%F-%T) \; 
&& echo "bash: cr: command not found"

我不喜欢通过再次获取日期和时间来指定副本的目标目录。

这是我第二次尝试以粗体显示的更改:

mkdir ~/Desktop/$(date +%F-%T) 
&& find . -mmin -20 -exec cp -r {} **$(find ~/Desktop/ -type f -cmin -1)** \; 
&& echo "bash: cr: command not found"

这次,我只是抓住不到一分钟前创建的桌面上的任何文件夹。 考虑到如果我在60秒内运行命令两次,它将失败,因为对我来说,“查找”(以粗体显示)将返回2个对cp命令无效的文件夹,这对我来说似乎仍然是一个较弱的解决方案...

现在,我面临的挑战是,如果当前目录为桌面,如何使这项工作正常? 我不想将新创建的文件夹复制到自身中! 另外,如何避免从cp获得任何其他输出? 有时我会收到警告/错误消息,告诉我我试图将文件复制到已经存在的相同位置!

任何其他实现此目的的方法都将受到欢迎,但我很好奇如何修改我的方法以使其正常工作

提前致谢!

只需遵循古老的编程格言:为多次使用的东西制作变量或函数。

folder="$(date +%F-%T)" \
&& mkdir "$HOME/Desktop/$folder" \
&& find -type d -name "$folder" -prune -o -type f -mmin -20 -exec cp {} "$HOME/Desktop/$folder" + \
&& echo "bash: cr: command not found"

另请注意,

  • find已经是递归的,所以不要使用cp -r
  • 修改时间对目录和文件的含义有些不同,听起来您只想复制文件,所以将其限制为-type f
  • 另外,您可以使用+而不是; 用于可以将多个文件作为参数的命令。 (它将运行cp file1 file2 file3 ... "$folder"而不是单独的cp命令,并最终运行尽可能少的cp命令,将它们拆分到ARG_MAX ,并ARG_MAX优化性能)
  • 为了省略目录,我使用了-type d -name "$folder" -prune ,它将停止从名为"$folder"降序目录中find 如果其他目录碰巧包含完全相同的名称,这可能会导致您的命令丢失某些其他目录,但否则它应能按预期工作。 (如果您始终从同一目录启动它,则可以对其进行改进以匹配确切路径,或者可以执行更复杂的-exec检查,但是我认为这在大多数情况下应该可行)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM