首页 > 解决方案 > 使用 For 循环重命名 Bash

问题描述

我有文件名 filename.gz.1,我需要将它们重命名为 filename.gz,有很多文件,每个名称都不同,

我知道我不能这样for i in $(ls); do mv $i $i.1; done做,但是我可以反过来做吗,从 filename.gz.1 到 filename.gz 并保留原始文件名?

我试过这个,

for i in $(ls | grep "xz\|gz"); do echo "mv $i $i | $(rev) | $(cut -c3-) | $(rev) |)"; done

但这忽略了我的管道。

谁能帮我?

标签: bashloopsfor-loop

解决方案


--extended-regexp使用管道作为分隔时必须使用。

echo -e "foo.xz\nbar.gz\nbaz" | grep -E "(xz|gz)"

并且不要ls用于列出您的文件,它不会保存。相反,您可以使用循环来搜索文件。

for file in /PATH/TO/FILES; do
echo $file
done

我还建议使用正则表达式来搜索以数字结尾的文件名,例如 ...

if [[ $file =~ [[:digit:]]$ ]]; then
  echo ${file%.*}
fi


推荐阅读