【问题标题】:Linux remove ; from filenamesLinux 删除;从文件名
【发布时间】:2021-07-08 11:44:06
【问题描述】:

我在 linux 中有文件:

omer.dat;1
yossi.dat;4

我想将它们更改为:(删除 ;NUMBER)

omer.dat
yossi.dat

我尝试做:

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

但它不起作用

我尝试做类似的事情:

mv omer.dat;1 omer.dat

Linux 找不到文件,不支持;

我想重命名所有文件

【问题讨论】:

  • 为什么mv "$file" "${file%;*}" 不起作用?它会去除与模式匹配的(最短)后缀,因此它应该完全按预期工作

标签: linux filenames mv


【解决方案1】:

这个mv "$file" "${file%;*}" 应该可以工作。也许您需要先填充变量? (我无法从问题中判断这是否正在发生):

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

如果您的系统上安装了,它带有一个rename 实用程序,可让您将正则表达式应用于文件名:

rename 's/;[^;]*$//' *\;*

【讨论】:

    【解决方案2】:

    当您在 Linux 命令中使用 ; 时,它会将其视为命令的结尾,因此当您编写时

    mv omer.dat;1 omer.dat
    

    它将其视为 2 个单独的命令,例如:mv omer.dat1 omer.dat。因此错误。 因此,要将; 用作名称的一部分,请使用以下内容:

    mv omer.dat\;1 omer.dat
    

    \; 部分可以解决问题。

    现在概括一下情况,我们可以使用${file%;*}这个模式,所以如果原始文件名有;,这个模式会删除;(包括)中的所有字符。 完整的代码如下:

    files=`ls|grep "\;"`
    for file in $files;do
        mv $file ${file%;*}
    done
    

    【讨论】:

    • 以及如何对所有文件运行此命令?
    • 喜欢 mv "$file" "${file%;*}"
    • @OmerAsher 我正在编辑我的答案给你完整的答案
    • 从不使用for i in $(ls anything),参见Bash Pitfalls #1。取而代之的是for file in *\;*; do ... 或将find 的输出通过管道传输到while read -r file; do ...
    猜你喜欢
    • 2019-07-03
    • 1970-01-01
    • 2015-08-17
    • 2013-02-27
    • 2020-04-19
    • 2013-12-22
    • 2011-05-29
    • 2012-08-02
    • 1970-01-01
    相关资源
    最近更新 更多