【问题标题】:Bash renaming with For Loop使用 For 循环重命名 Bash
【发布时间】:2021-12-01 01:03:11
【问题描述】:

我有文件名 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

但这忽略了我的管道。

谁能帮帮我?

【问题讨论】:

标签: bash loops for-loop


【解决方案1】:

你可以使用

for i in ...;
do
    echo "$i --> ${i%.*}"
done

${i%.*} 将在末尾删除 (%) 匹配句点后跟任何内容的内容 (.*)

【讨论】:

  • file.gz 会被重命名为 file,所以这不是一个好主意
【解决方案2】:

使用管道作为分隔符时,必须使用--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

【讨论】:

    【解决方案3】:

    我能够像这样解决它:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-12
      • 2014-05-29
      • 2020-06-07
      • 2014-01-20
      • 2013-01-29
      • 2021-12-24
      • 1970-01-01
      • 2021-03-31
      相关资源
      最近更新 更多