假设我有一个目录,里面有许多带有 .bak 扩展名的文件,我想从每个文件中删除这个文件。最简单的方法是什么?我的意思是一个可以执行人们可能期望的命令mv *.bak *
。
答案1
和zmv
Zsh 有zmv
,它提供了一个非常简单的界面来重命名(或复制)文件:
autoload zmv
zmv '(*).bak' '$1'
每一对括号捕获一个组,然后可以使用$1
、$2
等进行访问。以下是更多例子。
另一种方法zmv
是使用-W
适用于简单重命名任务的选项:
zmv -W '*.bak' '*'
使其始终可用的最简单方法zmv
是将autoload zmv
声明放在您的 中~/.zshrc
。
使用 Bash 语法
如果您想使用“普通”的 Bash 语法进行字符串操作,可以这样做:
for f in *.bak; do mv -- "$f" "${f%.bak}"; done
使用rename
工具
在某些 Linux 和 OS X 上,有一个rename
工具可以通过brew install rename
。
rename 's/.bak$//' *
需要$
捕获字符串的结尾,而不是恰好包含的文件名中间的部分.bak
。
答案2
除了给出的精彩答案之外,还有非常这种方法比较老式,可以在任何兼容 POSIX 的系统上运行 — — 即使没有像 bash 或 zsh 这样的现代 shell:
for f in *.bak; do mv $f `echo $f | sed -e 's/\.bak$//'`; done