【问题标题】:How to remove characters in filename up to and including second underscore如何删除文件名中最多包含第二个下划线的字符
【发布时间】:2017-10-01 22:54:47
【问题描述】:

我在这方面已经环顾了一段时间,似乎无法找到有关如何使用 sed 执行此操作的解决方案。我有一个名为:

FILE_772829345_D594_242_25kd_kljd.mov

我想改名

D594_242_25kd_kljd.mov

我目前一直在尝试让 sed 工作,但只能删除文件的第一秒:

echo 'FILE_772829345_D594_242_25kd_kljd.mov' | sed 's/[^_]*//'
_772829345_D594_242_25kd_kljd.mov

如何让 sed 再次执行相同的指令,直到第二个下划线?

【问题讨论】:

  • sed 's/[^_]*_[^_]*_//'

标签: macos unix sed rename file-rename


【解决方案1】:

如果所有文件的名称都相似,则可以使用cut,这比带有正则表达式的sed 简单得多:

cut -f3- -d_ <<< "FILE_772829345_D594_242_25kd_kljd.mov"

输出:

D594_242_25kd_kljd.mov

【讨论】:

    【解决方案2】:

    如果文件名在 shell 变量中,你甚至不需要使用sed,只需使用shell expansion with # 修剪第二个下划线:

    filename="FILE_772829345_D594_242_25kd_kljd.mov"
    echo "${filename#*_*_}"    # prints "D594_242_25kd_kljd.mov"
    

    顺便说一句,如果您要使用mv 重命名文件,请使用其-i 选项以避免在出现任何名称冲突时文件被覆盖:

    mv -i "$filename" "${filename#*_*_}"
    

    【讨论】:

    • 我用过这个方法!效果很好......现在只需要弄清楚如何让我的脚本接受多个文件。 echo "Please drag your file here:" read filename path=$(dirname "${filename}") file=$(basename "${filename}") mv -i "$path/$file" "$path/${file#*_*_}"
    • @DerekEdwards 试试read -a filenames; for filename in "${filenames[@]}"; do ...
    • 谢谢!那行得通。你能解释一下这是做什么的吗?!无论如何我都会调查一下。
    • @DerekEdwards read -a 将输入读取为数组而不是普通变量(并且它的引号/转义/等解析似乎与 Finder 编码文件路径的方式相匹配)。 for filename in [list of words]; do 遍历“单词”和 "${filenames[@]}" expands to the contents of the filenames` 数组,每个元素都被视为一个“单词”。
    • @DerekEdwards BTW,如果这个答案对你有用,请mark it as accepted
    猜你喜欢
    • 2015-09-01
    • 2021-02-15
    • 2019-12-22
    • 1970-01-01
    • 2019-09-30
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多