我希望这会起作用:
$ find . -type f -exec basename {} \; | while EFS= read -r f; do echo "${f##[0-9]}"; done
但是,例如,对于名为以下的文件:
1foo
11bar
它返回:
富
1酒吧
什么时候
富
酒吧
是期待。
PS:最终,我想mv "$f"
修改名称(并且还做其他修改)
编辑:
PS2:如果你考虑PS的话,它不是重复的。无论如何,标记为检查的答案令我满意。
答案1
如果rename
(有时称为prename
)是一个选项:
find . -name '[[:digit:]]*' -type f -exec rename 's:^(.*/)\d+([^/]*)\z:\1\2:s' {} +
解释:
( )
括号内的图案被保存,可以通过出现的次数来调用.*/
必须保留目录部分([^/]*)\z
: 直到主题末尾的所有非 / 字符。\1\2
重新打印捕获的目录以及输出名称中数字后面的所有内容
您可以使用-n
中的选项rename
进行试运行以首先检查结果。
答案2
find . -type f -exec basename {} \; | while IFS= read -r f; do echo "${f##+([0-9])}"; done
应提供所需的结果。
这使用扩展模式匹配运算符,这+()
意味着匹配一个或多个。
其他信息可以在 bash 手册页的模式匹配部分找到。