【问题标题】:I need another set of eyes to tell me what's wrong with this pipe and sed我需要另一双眼睛来告诉我这个管道和 sed 出了什么问题
【发布时间】:2022-11-07 02:53:47
【问题描述】:

我再次尝试重命名一些视频文件,但我的命令再次出现问题。如果我能得到另一双眼睛来看看这个并弄清楚我没有看到什么,我将不胜感激。

我有这样的文件;

'DARK Matter S01E03 Episode Three.mp4'

'DARK Matter S01E04 Episode Four.mp4'

ETC...

我正在尝试从名称中删除 " Episode Three", " Episode Four" 等,并且我编写了此命令,但它并没有按预期工作。

for file in *Episode*;do echo "rename \"$file\" "\"$file" | sed 's/ Episode*./.')";done

该命令的结果是;

rename "DARK Matter S01E03 Episode Three.mp4" "DARK Matter S01E03 Episode Three.mp4 | sed 's/ Episode*./.')
rename "DARK Matter S01E04 Episode Four.mp4" "DARK Matter S01E04 Episode Four.mp4 | sed 's/ Episode*./.')
rename "DARK Matter S01E05 Episode Five.mp4" "DARK Matter S01E05 Episode Five.mp4 | sed 's/ Episode*./.')

它没有识别到​​ sed 的管道,并且我的 sed 命令本身没有正确编写(我知道,我对正则表达式很糟糕)。 我会很感激你能给的任何帮助。

【问题讨论】:

  • 也许你想要find . -type f -name '*Episode*' -exec bash -c 'echo mv $0 $(sed "s/ Episode[^.]*//" <<< $0)' "{}" \;
  • find . -type f -name '*Episode*' -exec bash -c 'mv "$0" "$(sed "s/ Episode[^.]*//" <<< $0)"' "{}" \; 实际上重命名。
  • 好吧,我想这会起作用,但它完全重写了我原来的单行。幸运的是,我找到了自己的解决方案(感谢您!)
  • 管道运算符和 sed 命令都在传递给 echo 命令的字符串的双引号内。因此,您的代码中根本没有管道。
  • 顺便说一句,echo SOMETHING | somecommand 可以更可靠地写成somecommand <<<SOMETHING。请注意,除非您使用 echo -nE SOMETHING,否则 echo 不一定会输出作为参数传递的完全相同的字符序列。

标签: bash sed pipe rename


【解决方案1】:

使用 regex 并从 BASH_REMATCH[] 数组中提取匹配的部分:

regex='(.*) Episode [^.]+(.*)'

for file in *Episode*
do
    if [[ "${file}" =~ $regex ]]
    then
        # typeset -p BASH_REMATCH
        newfile="${BASH_REMATCH[1]}${BASH_REMATCH[2]}"
        cp "${file}" "${newfile}"
    fi
done

笔记:

  • regex 被定义为在第一个周期之后拾取任何东西(例如,.mp4.mkvsome.other.suffix
  • 取消注释typeset -p 命令以显示BASH_REMATCH[] 数组的内容
  • 验证结果后将cp 替换为mv

假设以下文件:

$ ls -l DARK*
-rw-rw----+ 1 username None 0 Feb 23 20:02 DARK Matter S01E03 Episode Three.mp4
-rw-rw----+ 1 username None 0 Feb 23 20:02 DARK Matter S01E04 Episode Four.mp4
-rw-rw----+ 1 username None 0 Feb 23 20:03 DARK Matter S01E05 Episode Five.mkv

代码结果如下:

$ ls -l DARK*
-rw-rw----+ 1 username None 0 Feb 23 20:02 DARK Matter S01E03 Episode Three.mp4
-rw-rw----+ 1 username None 0 Feb 23 20:08 DARK Matter S01E03.mp4
-rw-rw----+ 1 username None 0 Feb 23 20:02 DARK Matter S01E04 Episode Four.mp4
-rw-rw----+ 1 username None 0 Feb 23 20:08 DARK Matter S01E04.mp4
-rw-rw----+ 1 username None 0 Feb 23 20:03 DARK Matter S01E05 Episode Five.mkv
-rw-rw----+ 1 username None 0 Feb 23 20:08 DARK Matter S01E05.mkv

【讨论】:

    【解决方案2】:

    我自己终于弄清楚了;

    for file in *Episode*;do echo "rename "$file" "$file"" | sed 's/ Episode[^.]*//2';done
    

    重命名“DARK Matter S01E03 Episode Three.mp4”“DARK Matter S01E03.mp4”

    重命名“DARK Matter S01E04 Episode Four.mp4”“DARK Matter S01E04.mp4”

    重命名“DARK Matter S01E05 Episode Five.mp4”“DARK Matter S01E05.mp4”

    【讨论】:

    • 哦,我把“rename”改成了“mv”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    相关资源
    最近更新 更多