有没有办法在 cp、mv 等目标中使用 *?

有没有办法在 cp、mv 等目标中使用 *?

在 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

相关内容