【问题标题】:Bash rename last underscore in stringBash重命名字符串中的最后一个下划线
【发布时间】:2016-04-02 06:46:56
【问题描述】:

我有一个包含文件的目录,其中一些文件以下划线结尾。

我想测试每个文件,看看它是否以下划线结尾,然后去掉下划线。

我目前正在运行以下代码:

for file in *;do
   echo $file;
   if [[  "${file:$length:1}" == "_"   ]];then 
       mv $file  $(echo $file | sed "s/.$//g");
   fi
done

但它似乎没有用下划线重命名文件。例如,如果我有一个名为 all_indoors_ 的文件,我希望它能给我 all_indoors

【问题讨论】:

  • 你只是想删除下划线,没有别的吗?另外,$length 是在哪里定义的?
  • strip off 是什么意思?去掉下划线,还是去掉下划线和剩下的文字?
  • @fedorqui 也不确定,认为我弄错了 :-)
  • 脱掉。我的意思是删除示例中所述的下划线。 all_indoors_ 应重命名为 all_indoors
  • @kartoza-geek:是的,但是说文件是foo_bar,应该重命名为foobar,还是foo

标签: bash rename


【解决方案1】:

虽然不是纯粹的bash 方法,但您可以使用rename.ul(由perl 背后的人Larry Wall 编写)。重命名不是默认 linux 环境的一部分,而是util-linux 的一部分。

您使用重命名:

rename perlexpr files

(省略了一些标志)。

所以你可以使用:

rename 's/_$//' *

如果要删除所有字符,包括下划线和之后的字符。

正如@hek2mgl 指出的那样,有多个rename 命令(请参阅here),所以首先测试您是否选择了正确的命令。

【讨论】:

  • 来自 util-linux 的 rename 命令支持 perl 正则表达式! (我还需要意识到……;))
  • 为了完成混淆,还有一个 BSD 版本可用! :) rename 是一个不错的工具,但不幸的是它目前还不能移植。
  • @hek2mgl: 好吧,让我们同意,为了删除下划线,一个人不会放弃 Perlish 权力。 (此外,我去年去了 FOSDEM,Larry Wall 在他的演讲中说,新的 Perl 正则表达式的表示能力会降低,仅仅是因为它们容易出错)。
  • 好吧,但是来自 util-linux 的 rename 根本不支持正则表达式。它仅支持固定字符串。这真的很基本。
  • 如果您还删除说拉里·沃尔的rename 属于util-linux 的句子,我可以接受。 :)
【解决方案2】:

只需使用regex to check the string

for file in *
do
   [[ $file =~ "_$" ]] && echo mv "$file" "${file%%_}"
done

一旦您确定它按预期工作,请删除 echo 以便执行 mv 命令!


使用*_ 甚至可能更简洁,这样for 将循环遍历名称以_ 结尾的文件,正如hek2mgl 在cmets 中所建议的那样。

for file in *_
do
   echo mv "$file" "${file%%_}"
done

【讨论】:

  • 我喜欢这个答案,但为什么不使用 for file in *_ 呢?这将为您节省正则表达式检查。
  • @hek2mgl 你的方法是这里最聪明的方法:) 我还没有考虑过,用它来更新我的答案! (当然,您也可以随意添加自己的答案)。
  • 不,不......去吧! :)
  • @hek2mgl nice - fedorqui:引用参数以支持带空格的文件,如:for i in *_;做 echo mv "$i" "${i%_}";完成
  • 你可能不需要另一个%(不再匹配)
【解决方案3】:

你可以使用内置的string substitution:

for file in *_; do
    mv "$file" "${file%_}"
done    

【讨论】:

    【解决方案4】:

    你可以使用 which 将是递归的:

    while read f; do 
      mv "$f" "${f:0:-1}"; # Remove last character from $f
    done < <(find . -type f -name '*_')
    

    【讨论】:

    • 如果文件名中有换行符,这将中断。我建议循环遍历 glob 而不是在此处使用 find。
    猜你喜欢
    • 2018-09-28
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 2014-02-16
    相关资源
    最近更新 更多