![有没有办法在 cp、mv 等目标中使用 *?](https://linux22.com/image/1296368/%E6%9C%89%E6%B2%A1%E6%9C%89%E5%8A%9E%E6%B3%95%E5%9C%A8%20cp%E3%80%81mv%20%E7%AD%89%E7%9B%AE%E6%A0%87%E4%B8%AD%E4%BD%BF%E7%94%A8%20*%EF%BC%9F.png)
在 Windows 命令提示符中您可以执行此类操作:
ren *.doc *.txt
copy my-precious-document.doc *-backup.doc
在 Linux(包括 OS X)世界中有没有办法做到这一点?发现在 DOS 上运行更好的命令行命令是一件非常奇怪的事情...
答案1
不是。在 Windows 中,通配符(在 Windows 中,只有通配符)由命令执行;在 *nix 中,通配符由 shell 执行。您的第一个示例将如下所示:
mv a.doc b.doc c.doc a.txt b.txt c.txt
显然,该实用程序不知道如何处理此问题,也不应该这样做(忽略mv
假设您试图移动到目录之类的事情)。要执行您想要执行的操作,您需要使用类似以下内容:
find . -name "*.doc" -print0 | xargs -0 -I {} mv {} {}.txt
# Or...
find . -name "*.doc" -exec mv {} {}.txt \;
方便的是,Perl 中还附带一个实用程序,可用于重命名文件,恰当地称为rename
。
rename 's/\.txt$//' *.doc
答案2
请注意,该软件有两个版本,rename
随不同的发行版提供。
Perlrename
是 ubuntu 和变体中的默认语言,正如 @Hello71 所回答的那样
其他发行版可能会附带 util-linux-ng 包,其语法如下:
rename <from> <to> <files>
为了执行 OP 中的操作,命令将是
rename .doc .txt *.doc
对于以 .doc 结尾的所有文件,这会将文件名中的 .doc 替换为 .txt
OSX 不附带重命名,但如果您在 OSX 上安装了 Perl,您只需将重命名脚本从 Linux 安装复制到您的 OSX 机器上即可。Perl 版本比 util-linux(上文)灵活得多。它应该位于 Ubuntu 类型发行版的 /usr/bin/rename 中。该脚本要求 perl 位于 /usr/bin/perl 中,因此如果它位于 OSX 的其他地方,您可能需要对其进行编辑
答案3
for f in *.doc; do cp "${f}" "${f//.doc/}-backup.doc"; done
会起作用。这会将 -backup.doc 附加到每个文件的末尾。${f//.doc/}
将从原始文件名中删除所有 .docs,因此您不会以 .doc 结尾。不过,就我个人而言,当我进行备份时,我只需在文件名中添加 .bkup,因此如果我想将目录中的所有 .doc 备份到单独的备份文件夹中,我会导航到我想要的文件夹cp
并执行类似这样的操作for f in *.doc; do cp "${f}" "~/backups/${f}.bkup"; done