我正在编写一个脚本,检查目录中的文件是否有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
**这是在过去几个小时里骚扰我**
:(
答案 0 :(得分:3)
这是另一个:
#!/bin/bash
shopt -s extglob nullglob
for i in *.+([[:digit:]]); do
mv -- "$f" "${f%.*}"
done
诀窍是使用extglob
(默认情况下可能已经打开,再打开它没有坏处),以便*.+([[:digit:]])
扩展到以dot结尾的所有文件名一个或多个数字。因此,我们不需要任何正则表达式!
答案 1 :(得分:1)
您可以使用以下方法删除所有文件的扩展名:
for f in *.*
do
mv "$f" "${f%.*}"
done
至于你的尝试,[ .. ]
无法与globs匹配(你的glob只会匹配.
后的一位数)。请使用[[ .. ]]
。您还应引用$file
的所有出现次数。像shellcheck这样的工具会自动指出这些问题。
答案 2 :(得分:1)
纯bash解决方案可以是:
#!/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}"
。