【问题标题】:How to configure the find command to run in a Linux shell script?如何配置 find 命令以在 Linux shell 脚本中运行?
【发布时间】:2018-06-13 15:02:03
【问题描述】:

我正在尝试在 Linux shell 脚本中运行以下 find 命令。当我在终端运行命令时,它成功地从指定文件夹中找到所有扩展名为.mp4的文件,并将它们复制到一个临时文件夹。

find /datadrive/reports/ -name \*.mp4 -exec cp {} 
/datadrive/reports/video_tmp/ \;

但是,当我在 file_mover.sh 中运行它时

代码:

SHELL=/bin/bash
PATH=~/find /datadrive/reports/ -name '\*.mp4' -exec cp {} 
/datadrive/reports/video_tmp/ \;
done
MAILTO=root

输出:

./file_mover.sh: line 2: /datadrive/reports/: Is a directory.

我认为我在脚本中的某处缺少语法,我们将不胜感激。

【问题讨论】:

  • '\*.mp4'\*.mp4 不同
  • PATH 分配正在破坏事物。而done 没有语法意义。
  • find 的调用不会返回任何有用的信息,因此无需尝试将其分配给变量。
  • 顺便说一句,如果这是一个 GNU 平台(可能带有 Linux 标签),您可以使用 cp -t 将多个文件名传递给一个 cp 命令,而不是需要每个文件运行一次cp
  • 如果所有文件都在该文件夹中,并且不在子文件夹中,则根本不需要查找:cp -t /datadrive/reports/video_tmp /datadrive/reports/*.mp4

标签: linux bash shell find


【解决方案1】:

以下是完全有效的脚本:

#!/bin/sh
find /datadrive/reports/ -name '*.mp4' -exec cp -t /datadrive/reports/video_tmp/ '{}' +

注意变化:

  • 我们没有尝试分配给PATH。这是一个具有特殊含义的变量(它决定了程序的位置),因此重新分配它通常会搞砸。
  • 我们没有在单引号内使用反斜杠。 -name \*.mp4 与所有以 .mp4 结尾的文件匹配是合法的。 -name '*.mp4' 出于相同目的是合法的。你不能把两者结合起来,让它仍然是你想要的。
  • 通过使用cp -t dest source1 source2 ...,我们允许find 只运行cp 所需的最短次数,以便将目标文件名放在命令行上。

分配SHELLMAILTO 也没有意义;它们在 crontab(以及其他一些特定/狭义的情况)中有意义,但在通用脚本中没有意义。

【讨论】:

  • 我一直在使用我在系统上找到的一些现有遗留代码,并且看到在脚本中运行命令时使用的 PATH 并假设它是这样工作的。但是重新格式化我的脚本以按照您的说明工作已经解决了我的问题。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-02
  • 1970-01-01
相关资源
最近更新 更多