【问题标题】:Rename file by removing last n characters通过删除最后 n 个字符重命名文件
【发布时间】:2013-11-01 01:33:16
【问题描述】:

我想通过删除最后 N 个字符来重命名文件

例如,我想通过删除最后 7 个字符来重命名这些文件

发件人:

file.txt.123456

收件人:

file.txt

这在单个命令中是否可行?

【问题讨论】:

    标签: shell unix


    【解决方案1】:

    根据您对单个命令的含义,至少您可以使用一些管道来完成:

    mv file.txt.123456 $(ls file.txt.123456 | rev | cut -c8- | rev)
    

    看看你的例子,我想知道“从最后一个点到末尾删除字符”这样的模式是否更合适。

    【讨论】:

      【解决方案2】:

      你在使用 bash 吗?

      file="file.txt.123456"
      mv $file ${file::(-7)}
      

      【讨论】:

      • 这对我有用过很多次。现在突然间我收到错误:-bash: (-7): substring expression
      • 你的字符串太短了,你要求 bash 删除比它更多的字符。 :)
      • 但是我的文件名特别长?与此类似:T591_Name_Anothername_L200.fasta.new.new。我在循环中使用它,因为我过去做过一百万次。 for file in *.new; do; mv $file ${file::(-7)}; done.我很困惑。
      【解决方案3】:

      您可以使用删除固定数量的字符

      mv "$file" "${file%???????}"  # 7 question marks to match 7 characters
      

      这适用于任何符合 POSIX 标准的 shell。

      要删除最后一个扩展名(可能多于或少于 7 个字符),请使用

      mv "$file" "${file%.*}"
      

      要在给定扩展名之后修剪所有内容,您可以尝试

      EXT=csv
      mv "$file" "${file%.$EXT.*}".$EXT
      

      实际上删除了.$EXT 和之后的所有内容,但随后重新附加了.$EXT

      【讨论】:

      • 如果我只希望文件扩展名为 .csv 怎么办?
      • 我不确定你在问什么。 mv "$file" "${file%.csv}" 将从文件名中删除 .csv,但不会删除另一个扩展名(这将是一个无操作,因为您只需将文件重命名为自身)。
      • 假设我有一个文件名file.12323.csv.txt.13123,我希望它是file.12323.csv
      • 好问题 :) 我会看看我能想出什么。
      【解决方案4】:

      这类似于亚当的,但没有 bashisms(因为它被标记为 shell 而不是 bash)。

      remove_n(){
        echo ${2:0:$((${#2}-$1))}
      }
      
      remove_n 8 file.txt.1234567
      #remove last 8 characters from 2nd argument
      #for filenames in variables use
      mv "$VAR" `remove_n 8 "$VAR"`
      

      【讨论】:

      • ${foo:offset:length} 与 Adam 使用的 bashism 相同。
      • 它也被其他shell支持,例如busybox ash,而其他方法不支持
      • 我不关注。我看到的唯一区别是 Adam 使用负长度,而您计算显式正长度。
      • ::() 不同于 :${start}:${length} 和 () 不受支持,但 $((integer ops)) 也不是子字符串操作的负值,所以从位置 :0 开始(零不是必需的,而是留在原地以显示意图),然后将字符串 ${#varname} 的长度减去我们需要取出的金额,这必须在 $( ()) 在 bash 之外。我经常使用busybox ash,所以差异很明显。
      • 好的,看来ashbash 对同一个非标准结构有两个稍微不同的实现。很高兴知道。
      猜你喜欢
      • 1970-01-01
      • 2022-01-14
      • 2020-09-03
      • 2019-07-29
      • 2023-04-06
      • 2020-02-27
      • 2013-06-05
      • 1970-01-01
      • 2014-10-19
      相关资源
      最近更新 更多