0

我正在编写一个脚本,检查目录中的文件是否有 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

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

:(

4

3 回答 3

3

这是另一个:

#!/bin/bash

shopt -s extglob nullglob

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

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

于 2013-07-09T21:49:49.853 回答
1

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

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

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

于 2013-07-09T21:25:53.090 回答
1

解决方案可以是:

#!/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}".

于 2013-07-09T21:28:46.217 回答