Bash: 查找特定文件并从名称中删除最后 5 个字符

Bash: Find specific files and cut last 5 characters from name

我的 ./ 文件夹下有一些文件,例如:

$ ls
XX
AArse
BArse
CCCAArse
YY
....

一些命令之后我想要:

AA
BA
CCCAA

即如果文件名末尾包含 rse,文件将被重命名(从名称中删除 rse)。

如何在 bash 中实现 某些命令

使用 Perl 的独立 rename 命令、正则表达式和 bash 的通配:

rename -n 's/...$//' *rse

在某些发行版中 rename 也称为 prename。如果一切正常,请删除 -n.

bash:

shopt -s nullglob
for file in *rse; do
  mv -i "$file" "${file%rse}"
done

shell 选项 nullglob 将不匹配的 glob 模式扩展为空字符串,参数扩展 ${file%rse} 从文件名中删除最短的后缀 rse

选项-i提示覆盖已有文件。

给出一个更通用的答案:

finder.sh:

#!/usr/bin/env bash
usage() {
  echo 'Usage: ./finder.sh string_to_remove'
  exit
}

if [ "$#" -ne 1 ]; then
  usage
fi

check_string=
counter=0
for file in ./*
do
  if [[ -f $file ]]; then
    if [[ $file == *"$check_string"* ]]; then
      mv -v "$file" `echo $file | sed "s/$check_string//"`
      let "counter++"
    fi
  fi
done

if [ ! "$counter" -gt 0 ]; then
  echo "No files found containing '$check_string'"
else
  echo "$counter files effected with string '$check_string'"
fi

然后您可以通过以下方式将其与不同的子字符串一起使用(在执行 chmod +x finder.sh 之后):

./finder.sh any_string
# Removes 'any_string' from all filenames

示例:

目录列表如下:

$ ls
AArse  
AByfl  
BArse  
CCCAArse
XX
YY

你可以运行

./finder.sh rse; ./finder.sh yfl

得到以下输出:

renamed './AArse' -> './AA'
renamed './BArse' -> './BA'
renamed './CCCAArse' -> './CCCAA'
3 files effected with string 'rse'
renamed './AByfl' -> './AB'
1 files effected with string 'yfl'

这样您的目录现在看起来像:

AA
AB
BA  
CCCAA
XX
YY

当然,您可能希望在使用 mv 命令时内置一些潜在覆盖检查。