运行移动文件的 bash 脚本时出错

运行移动文件的 bash 脚本时出错

我是 Bash 脚本的新手,想要创建 Bash 脚本,根据脚本中定义的日期在源和目标之间移动几天前的旧文件。

当我运行此脚本时出现错误

find:路径必须在表达式之前:mv 用法:find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

#!/bin/bash

echo "Enter Your Source Directory"
read soure

echo "Enter Your Destination Directory"
read destination 

echo "Enter Days"
read days




   find $soure -mtime +$days  mv $soure $destination {} \;

  echo "Files $days old moved from $soure to $destination"

缺少了什么或者错误了什么????请帮我创建这个脚本。

答案1

我确信你已经遇到过它们,但是开始学习 bash 脚本的最佳地方有两个:Bash 初学者指南高级 Bash 脚本指南。如果您还没有看过这两个资源,如果您想进一步了解 bash 脚本,我强烈建议您将它们添加到书签中。

由于编辑问题,删除了与流控制相关的部分。 find 命令需要-exec在命令之前,否则它将不知道这mv实际上是您尝试对文件执行的命令。此外,{}find 中的用于引用 find 命令的结果,因此您不需要将其$source作为 find 的一部分。 find 命令可能看起来更像:

find $source -mtime +$days -exec mv {} $destination \;

如果 find 结果中包含带空格的文件/目录,则可能需要循环遍历结果(这将使 do/done 重新混合),以便您可以将 find 的结果包含在变量中,然后将其括在引号中。这将提供类似于以下的结构:

for result in $(find $soure -mtime +$days)
do
    mv "${result}" $destination
done

如果您仍然遇到问题,我建议您在运行脚本时包含终端窗口的副本。此外,尝试只运行 find 命令本身而不运行部分内容-exec mv...,并将变量替换为您在脚本执行期间通常填写的内容。这样,您就可以了解 find 命令匹配的内容,从而在对文件位置进行任何更改之前,您可以确定它匹配您想要的文件。

答案2

我认为你需要在 do 循环之前有一个 for 语句,才能让它工作。看这里,了解有关 Bash 循环的更多信息。

相关内容