【问题标题】:rename files and remove shell PID as extention重命名文件并删除 shell PID 作为扩展名
【发布时间】:2013-07-09 21:16:45
【问题描述】:

我正在编写一个脚本来检查目录中的文件是否具有 shell pid 作为扩展名,并以删除扩展名的方式重命名它们。我已经重命名了几个文件以使用 mv filename filename.$$ 添加 ext。

我需要关于如何再次重命名它们以使它们不包含 PID 的建议。

到目前为止我已经写了:

for file in *
do
if [ -s $file ]
then
  if [ $file = *.[0-9] ]
  then
  #mv command
  fi
fi
done

** 这在过去几个小时里一直在骚扰我 **

:(

【问题讨论】:

  • 修正格式以使代码更易于阅读

标签: linux bash pid


【解决方案1】:

这是另一个:

#!/bin/bash

shopt -s extglob nullglob

for i in *.+([[:digit:]]); do
    mv -- "$f" "${f%.*}"
done

诀窍是使用extglob(默认情况下可能已经打开,再次打开它不会有什么坏处),以便*.+([[:digit:]])扩展为所有以点结尾的文件名,后跟一个或多个数字.因此我们不需要任何正则表达式!

【讨论】:

  • +1!我很少使用扩展 glob,我想我应该对它有更多的经验!谢谢!
【解决方案2】:

解决方案可以是:

#!/bin/bash

touch a.12345
touch b.23456

for file in *; do
  [[ $file =~ \.[0-9]+$ ]] && echo ${file%$BASH_REMATCH}
done

输出:

a
b

仅当扩展名仅包含一个或多个数字时,它才会切断它。其实它也切断了.0000000000,这不是一个有效的PID,但也许这不是一个大问题。

echo 命令可以替换为mv "$file" "${file%$BASH_REMATCH}"

【讨论】:

  • 谢谢@TrueY。理解正则表达式位,你能解释一下“echo ${file%$BASH_REMATCH}”主要在文件之后...
  • @BashNoob:[[ $VAR =~ RE ]] 将 $VAR 与右侧的正则表达式相匹配。放置到BASH_REMATCH 数组中的匹配部分。因为我只需要它的第一个(也是唯一一个)项目,所以不需要添加索引。 ${var%pattern} 从变量内容的末尾删除模式。
【解决方案3】:

您可以使用以下方法删除所有文件的扩展名:

for f in *.*
do 
    mv "$f" "${f%.*}"
done

至于您的尝试,[ .. ] 无法与 glob 匹配(并且您的 glob 只会匹配 . 之后的单个数字)。为此使用[[ .. ]]。您还应该引用所有出现的$file。 shellcheck 之类的工具会自动指出这些问题。

【讨论】:

    猜你喜欢
    • 2019-10-18
    • 2019-01-06
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 2020-11-20
    相关资源
    最近更新 更多