【问题标题】:Bash: can't expand wildcard in filename from "read" command variableBash:无法从“读取”命令变量中扩展文件名中的通配符
【发布时间】:2020-04-02 15:40:47
【问题描述】:

我已经用尽了所有可能的搜索。

我正在尝试使用 read 从 CLI 读取文件名/路径,以便我可以链接文件以进行批量排序。我已经尝试过各种各样的事情,从引号到没有,尝试使用 eval 来扩展,还有很多其他的事情。它们都不起作用。

这是我当前状态的脚本:

#!/bin/bash
read -p "from? (explicit, folder/) " -e from
read -p "to? (explicit, folder/) " -e to
read -p "base filename before ep name? " -e formatOldStart
read -p "base filename after ep name? " -e formatOldEnd

...

  lnFrom=$from$formatOldStart$currentEpisodeNumber$formatOldEnd

  echo $lnFrom

  #ln "$lnFrom" "$lnTo"

这是一个示例用法:

$ from? (explicit, folder/) $HOME/archive/_DATA_ARCHIVE/.data/Example\ Complete\ Series\ +\ Movies\ \[Dual\ Audio\]/Example\ \[Dual\ Audio\ DVD\ 480p\]/
$ to? (explicit, folder/) $HOME/archive/_DATA_ARCHIVE/_video_storage/Anime/Shows/Example/Season\ 1/
$ base filename before ep name? \(Hi10\)_Example_-_
$ base filename after ep name? _(DVD_480p)_(a-S)_(*).mkv

然后是输出:

$HOME/archive/_DATA_ARCHIVE/.data/Example Complete Series + Movies [Dual Audio]/Example [Dual Audio DVD 480p]/(Hi10)_Example_-_015_(DVD_480p)_(a-S)_(*).mkv

这是预期的输出:

/home/user/archive/_DATA_ARCHIVE/.data/Example Complete Series + Movies [Dual Audio]/Example [Dual Audio DVD 480p]/(Hi10)_Example_-_015_(DVD_480p)_(a-S)_(6852D8ED).mkv

我只能在手动插入通配符(不是正则表达式)和this post 建议的文件名后获得预期的输出,但这显然意味着我每次想要使用它时都必须手动编辑这个脚本没有自动完成的新文件夹。我有很多东西要分类,所以这根本不可能。

【问题讨论】:

  • 您能否将其简化为显示您看到的问题的最小可能代码位 (minimal reproducible example)?
  • @BenjaminW。调整。让我知道它是否可以接受。
  • 输入行只是数据,不是shell扩展的代码。 $HOME 是永远不会被解析为 shell 变量的文字文本。
  • 我建议直接使用from=$1; to=$2; ... 而不是提示用户;您可以在脚本运行之前让 shell 处理$HOME/archive/_DATA_ARCHIVE...
  • "这显然意味着每次我想将它用于新文件夹时,我都必须手动编辑此脚本" 什么?为什么?

标签: bash shell glob


【解决方案1】:

编辑:在采用不同的方法后,我想出了一个更简单的单行,主要适用于选项卡完成(当然,直到变量):

for index in {28..54}; do ln "/home/user/archive/_DATA_ARCHIVE/.data/Example Complete Series + Movies [Dual Audio]/Example [Dual Audio DVD 480p]/(Hi10)_Example_-_0${index}_(DVD_480p)_(a-S)_("*").mkv" "/home/user/archive/_DATA_ARCHIVE/_video_storage/Anime/Shows/Example/Season 2/Example S2E0${index}.mkv"; done

所以我找了人帮忙,幸好我能解决它。

首先,我们在read 命令中使用-r 来不解析转义字符。

然后我们分配 lnFromlnTo 不带引号:

lnFrom=$from$formatOldStart$currentEpisodeNumber$formatOldEnd
lnTo=$to$formatNewStart$currentEpisodeNumber$formatNewEnd

然后我们在ln命令上使用eval来解析变量:

eval ln "$lnFrom" "$lnTo"

现在是的,我了解 issues with eval 关于这是一个安全问题,但这个脚本在我家的封闭网络上运行,所以我不在乎。

如果有人可以提供无需 eval 的解决方案,我将非常乐意接受该答案。

对不起,如果这对你们很多人来说是显而易见的。我熟悉工作中的 JavaScript,但除了绕过操作系统的基本命令外,我对 bash/unix 不是很熟悉。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-28
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    相关资源
    最近更新 更多