3

问题

在一个目录中有以下格式的文件:*-foo-bar.txt。

示例目录:

$ ls *-*
asdf-foo-bar.txt  ghjk-foo-bar.txt  l-foo-bar.txt     tyui-foo-bar.txt
bnm-foo-bar.txt   iop-foo-bar.txt   qwer-foo-bar.txt  zxcv-foo-bar.txt

所需目录:

$ ls *.txt
asdf.txt  bnm.txt  ghjk.txt  iop.txt  l.txt  qwer.txt  tyui.txt  zxcv.txt

解决方案 1

我想到的第一个解决方案看起来有点像这个丑陋的黑客:

ls *-* | cut -d- -f1 | sed 's/.*/mv "\0-foo-bar.txt" "\0.txt"/' > rename.sh && sh rename.sh

上述解决方案会即时创建一个脚本来重命名文件。该解决方案还尝试根据http://mywiki.wooledge.org/ParsingLsls解析不是一件好事的输出。

解决方案 2

这个问题可以用这样的 shell 脚本更优雅地解决:

for i in *-*
do
    mv "$i" "`echo $i | cut -f1 -d-`.txt"
done

上述解决方案使用循环重命名文件。

问题

有没有办法在一行中解决这个问题,这样我们就不必显式编写循环脚本,或生成脚本,或调用新的或当前的 shell(即避免使用 sh、bash、. 等命令) ?

4

1 回答 1

6

您是否尝试过重命名命令?

例如:

rename 's/-foo-bar//' *-foo-bar.txt

如果您没有可用的,我会使用find,sedxargs:

find . -maxdepth 1 -mindepth 1 -type f -name '*-foo-bar.txt' | sed 's/-foo-bar.txt//' | xargs -I{} mv {}-foo-bar.txt {}.txt
于 2012-10-01T14:06:52.030 回答