【问题标题】:mv brace expansion with globbing in scriptmv 大括号扩展与脚本中的通配符
【发布时间】:2019-01-16 03:44:34
【问题描述】:

我正在尝试将照片移动到其他目录。当我从命令行(在 bash 和 zsh 中)运行 mv 时效果很好:

mv './DSC_{2385..2387}.NEF*' ./new/STACK_2385-2387

我编写了这个 bash 脚本,它将一系列照片移动到不同的目录。

但如果我从脚本运行它就不会:

#/bin/bash
set -x
read START
read END
PREFIX="STACK"
DIRNAME=$PREFIX\_$START-$END
mkdir ./new/$DIRNAME
mv ./DSC_{$START..$END}.NEF* ./new/$DIRNAME

.

$./script.sh
mv ./DSC_{$START..$END}.NEF* ./new/$DIRNAME
+ mkdir ./new/STACK_2385-2387
+ mv './DSC_{2385..2387}.NEF*' ./new/STACK_2385-2387
mv: cannot stat './DSC_{2385..2387}.NEF*': No such file or directory

./new/STACK_2385-2387 正在创建中。相关的*.NEF raws 和 *.NEF.xmp sidecar 文件也存在,包括 2385、2386、 2387,所以这不是问题。

【问题讨论】:

  • 它与交互式与非交互式无关,而是尝试在大括号扩展中使用参数。大括号扩展发生在所有其他扩展之前,所以你不能这样做。
  • 你在哪里设置STARTEND
  • @BenjaminW。谢谢我不知道。有关解决方法,请参阅 karakfa 的答案。 STARTEND 的好消息;我已经调整了脚本。

标签: bash brace-expansion


【解决方案1】:

你只能用邪恶的eval 来做变量大括号扩展,就像这个例子一样

$ a=1; b=10; eval echo {$a..$b}
1 2 3 4 5 6 7 8 9 10

所以您需要将mv 命令更改为

$ eval mv ./DSC_{$START..$END}.NEF* ./new/"$DIRNAME"

也许双引号也是变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 2014-05-24
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    相关资源
    最近更新 更多