在一个目录中有这些文件和更多:
- 文件1.txt
- 文件1.html
- 文件1.pdf
- ...
每一个文件1应替换为新文件:
- 新文件.txt
- 新文件.html
- 新文件.pdf
- ...
我试过了:
for f in $(ls file1*); do mv $f newfile*; done
这确实取代了全部文件与文件1到一个文件新文件*。
for f in $(ls file1*); do mv $f ${f/$f/"newfile"}; done
这也取代了全部文件与文件1到一个文件新文件。或者
find . -name "file1.*" -exec sh -c 'mv I DONT KNOW' _ {} \;
我不明白如何将文件名的一部分设置为变量并替换它。
使用 mv 执行此操作的最简单方法是什么?
答案1
如果您在 Linux 上运行,那么实现它的最简单方法是使用rename
(它是软件包的一部分util-linux
:
rename 'file1' 'newfile' file1*
这将执行您所描述的操作。期望rename
三个参数:
- 在文件名中查找什么
- 用什么代替
- 要处理的文件掩码
我快速搜索rename
,这是第一个命中的例子:http://linux.icydog.net/rename.php
更新如果您的系统上没有rename
,但有bash
,那么您可以按如下方式进行批量重命名(这相当于rename
上面给出的内容):
for f in file1*; do mv -v "$f" "${f/file1/newfile}"; done
答案2
尝试:
for f in ./file1.*; do
echo mv "$f" "newfile.${f##*.}"
done
该代码仅显示 mv 命令的内容。如果这是您想要的,请删除echo
mv 命令前面的 。
答案3
在基于 Debian 的系统上,该rename
实用程序是 Perl rename,并且语法略有不同:
rename 's/file1/newfile/' file1*
第一个参数是一个 Perl 表达式,它将应用于找到的每个文件名。
答案4
使用 GNU 查找:
find . -maxdepth 1 -name "file1*" -printf "%f\0" | xargs -0 -I {} echo mv -v {} new{}
如果一切看起来都正常,请删除echo
.