【问题标题】:Multiple find exec options: synology index command line多个 find exec 选项:synology index 命令行
【发布时间】:2020-04-06 11:41:12
【问题描述】:

我想在将 NAS 上的一些文件移动到正确的文件夹后为其编制索引。 我的命令是这样的:

find *.$ext -exec mv "{}" $path \; -exec synoindex -a $(echo $path)$(basename "{}") \;

第一部分正在运行。所有带有 $ext 扩展名的文件都被移动到目标 $path。 但是第二部分,它应该在他们的新 $path 文件夹中索引这些文件,不起作用。

这很奇怪,因为:

  • {} 包含正确的值 => 处理的每个文件的完整旧路径 为了确保这一点,我添加了第三部分,它只做:-exec echo {} \;
  • 在将 {} 替换为一个实数后,单独执行 $(echo $path)$(basename "{}") 有效
    以值为例 => 给出了完整的新路径 => 语法正确
  • 单独执行 synoindex -a $(echo $path)$(basename "{}") 工作,将 {} 替换为 以一个实际值为例 => 命令是正确的

感谢您的任何想法。

问候,

【问题讨论】:

    标签: unix find exec nas synology


    【解决方案1】:

    您的命令替换 $(echo $path)$(basename "{}") 在执行 find 之前由您的 shell 执行。 而且您不需要echo $path 变量。您可以改为执行一个小的 shell 脚本:

    find . -type f -name "*.$ext" -exec sh -c '
      targetpath=$1; shift # get the value of $path
      for file; do
        mv -i "$file" "$targetpath"
        synoindex -a "$targetpath/${file##*/}"
      done
    ' sh "$path" {} +
    

    这将在当前目录. 中开始find 搜索常规文件 (-type f),以结尾 文件扩展名$ext (-name "*.$ext") 并执行一个小的 shell 脚本,将 $path 变量作为第一个参数传递给脚本。 以下参数是find找到的文件路径。

    参数扩展${file##*/} 会从文件中删除最长前缀*/,结果是基本名称。 如果您的$path 变量已经包含一个斜杠/,则在$targetpath 之后省略/

    【讨论】:

    • 感谢您的回答,我会检查您的脚本。您确定在 find 之前执行命令 $(echo $path) 和 $(basename "{}") 因为 if do : find 。 -name Benny.and.Joon.1993*.mp4 -exec echo string1 \; -exec 回显字符串 2 \;我只有在 find 返回 0 时才有结果:string1 string2 这意味着他首先被执行
    • 是的,$(basename "{}") 立即计算为{},然后第二个-exec$(echo $path){} 的结果上运行,并且仅在第一个-exec 的退出状态时执行是0。要调试我的答案,您可以在 mvsynoindex 之前添加 echo 以查看命令的作用。
    • 谢谢,你的脚本帮了大忙
    猜你喜欢
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多