【问题标题】:Bash script to copy all files in current directory modified recently into a newly created folder elsewhereBash脚本将当前目录中最近修改的所有文件复制到其他地方新创建的文件夹中
【发布时间】:2014-07-30 02:30:27
【问题描述】:

更多细节:

  • 我想先在桌面上新建一个目录。目录的名称将是当前日期和时间。
  • 我想将当前工作目录中在过去 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 次,这对我来说似乎仍然是一个弱解决方案,它将失败,因为“查找”(粗体)将返回 2 个对 cp 命令无效的文件夹...

现在我提出的挑战是,如果我的当前目录是桌面,我该如何进行这项工作?我不想将新创建的文件夹复制到自身中!另外,我怎样才能避免从 cp 获得任何额外的输出?有时我会收到警告/错误,告诉我我正在尝试将文件复制到它已经存在的相同位置!

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

提前致谢!

【问题讨论】:

    标签: bash shell command alias


    【解决方案1】:

    只需遵循古老的编程格言,即为您多次使用的东西创建变量或函数。

    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,并稍微优化性能)
    • 为了省略目录,我使用了-type d -name "$folder" -prune,它将阻止find 从名为"$folder" 的降序目录中停止。如果它们碰巧包含完全相同的名称,这可能会导致您的命令错过一些其他目录,但否则它应该按预期工作。 (如果你总是从同一个目录启动它,这可以改进以匹配确切的路径,或者你可以做一个更复杂的-exec 检查,但我认为这在大多数情况下应该可以工作)

    【讨论】:

      猜你喜欢
      • 2016-01-17
      • 1970-01-01
      • 2021-01-18
      • 2013-09-30
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2012-12-17
      • 1970-01-01
      相关资源
      最近更新 更多