使用sed批量重命名文件

Dan*_*ood 74 bash shell sed file-rename

目的

更改这些文件名:

  • F00001-0708 RG-biasliuyda
  • F00001-0708-CS-akgdlaul
  • F00001-0708-VF-hioulgigl

这些文件名:

  • F0001-0708-RG-biasliuyda
  • F0001-0708-CS-akgdlaul
  • F0001-0708-VF-hioulgigl

壳牌代码

去测试:

ls F00001-0708-*|sed 's/\(.\).\(.*\)/mv & \1\2/'
Run Code Online (Sandbox Code Playgroud)

去表演:

ls F00001-0708-*|sed 's/\(.\).\(.*\)/mv & \1\2/' | sh
Run Code Online (Sandbox Code Playgroud)

我的问题

我不明白sed代码.我理解替换命令是什么

$ sed 's/something/mv'
Run Code Online (Sandbox Code Playgroud)

手段.我有点理解正则表达式.但我不明白这里发生了什么:

\(.\).\(.*\)
Run Code Online (Sandbox Code Playgroud)

或者在这里:

& \1\2/
Run Code Online (Sandbox Code Playgroud)

对我来说,前者看起来就像是:"一个角色,后跟一个角色,然后是单个角色的任何长度序列" - 但肯定还有更多的东西.至于后一部分:

& \1\2/
Run Code Online (Sandbox Code Playgroud)

我不知道.我真的很想了解这段代码.伙计们,请帮帮我.

Edw*_*son 134

首先,我应该说最简单的方法是使用prename或rename命令.

在Ubuntu,OSX(Homebrew包rename,MacPorts包p5-file-rename)或其他具有perl重命名(prename)的系统上:

rename s/0000/000/ F0000*
Run Code Online (Sandbox Code Playgroud)

或者在从util-linux-ng重命名的系统上,例如RHEL:

rename 0000 000 F0000*
Run Code Online (Sandbox Code Playgroud)

这比同等的sed命令更容易理解.

但至于理解sed命令,sed联机帮助页很有帮助.如果你运行man sed并搜索&(使用/ command搜索),你会发现它是s/foo/bar/replacementments中的特殊字符.

  s/regexp/replacement/
         Attempt  to match regexp against the pattern space.  If success?
         ful,  replace  that  portion  matched  with  replacement.    The
         replacement may contain the special character & to refer to that
         portion of the pattern space  which  matched,  and  the  special
         escapes  \1  through  \9  to refer to the corresponding matching
         sub-expressions in the regexp.
Run Code Online (Sandbox Code Playgroud)

因此,\(.\)匹配第一个字符,可以引用\1.然后.匹配下一个字符,该字符始终为0.然后\(.*\)匹配文件名的其余部分,可以引用\2.

替换字符串使用&(原始文件名)将它们全部放在一起\1\2,除了第二个字符(0)之外,它是文件名的每个部分.

恕我直言,这是一个非常神秘的方式.如果出于某种原因,重命名命令不可用并且您想使用sed进行重命名(或者您可能正在为重命名做一些过于复杂的事情?),在正则表达式中更明确地使它更具可读性.也许是这样的:

ls F00001-0708-*|sed 's/F0000\(.*\)/mv & F000\1/' | sh
Run Code Online (Sandbox Code Playgroud)

能够看到s/search/replacement /中实际发生的变化使其更具可读性.如果您不小心运行两次或其他东西,它也不会继续从文件名中吸取字符.

  • 要调试此操作,请将管道移至末尾的sh.命令将回显到屏幕. (3认同)
  • 在我的 RHEL 服务器上,重命名语法为“rename 0000 000 F0000*” (2认同)

gho*_*g74 39

你有你的sed解释,现在你可以只使用shell,不需要外部命令

for file in F0000*
do
    echo mv "$file" "${file/#F0000/F000}"
    # ${file/#F0000/F000} means replace the pattern that starts at beginning of string
done
Run Code Online (Sandbox Code Playgroud)


Guy*_*Guy 21

sed几年前我写了一篇关于批量重命名的例子的小帖子:

http://www.guyrutenberg.com/2009/01/12/batch-renaming-using-sed/

例如:

for i in *; do
  mv "$i" "`echo $i | sed "s/regex/replace_text/"`";
done
Run Code Online (Sandbox Code Playgroud)

如果正则表达式包含组(例如\(subregex\),那么您可以在替换文本中使用它们\1\,\2等等.


小智 15

最简单的方法是:

for i in F00001*; do mv "$i" "${i/F00001/F0001}"; done
Run Code Online (Sandbox Code Playgroud)

或者,便携地,

for i in F00001*; do mv "$i" "F0001${i#F00001}"; done
Run Code Online (Sandbox Code Playgroud)

这将替换F00001文件名中的前缀F0001.在这里得到mahesh:http://www.debian-administration.org/articles/150

  • 你应该正确引用变量插值; `mv"$ i""$ {i/F00001/F0001}"`` 但是+1 (2认同)

Gil*_*not 8

使用 perl rename (工具箱中必须有):

rename -n 's/0000/000/' F0000*
Run Code Online (Sandbox Code Playgroud)

-n当输出看起来不错才能真正重命名时,请删除开关。

警告 还有其他同名的工具可能能够也可能无法做到这一点,所以要小心。

作为包一部分的重命名命令util-linux不会。

如果运行以下命令 ( GNU)

$ rename
Run Code Online (Sandbox Code Playgroud)

你看perlexpr,那么这似乎是正确的工具。

如果不是,则将其设为默认值(通常已经是这种情况)Debian并衍生如下Ubuntu

$ sudo apt install rename
$ sudo update-alternatives --set rename /usr/bin/file-rename
Run Code Online (Sandbox Code Playgroud)

对于 archlinux:

pacman -S perl-rename
Run Code Online (Sandbox Code Playgroud)

对于 RedHat 系列发行版:

yum install prename
Run Code Online (Sandbox Code Playgroud)

“prename”包位于EPEL存储库中。


对于 Gentoo:

emerge dev-perl/rename
Run Code Online (Sandbox Code Playgroud)

对于 *BSD:

pkg install gprename
Run Code Online (Sandbox Code Playgroud)

或者p5-File-Rename


对于 Mac 用户:

brew install rename
Run Code Online (Sandbox Code Playgroud)

如果您的其他发行版没有此命令,请搜索您的软件包管理器来安装它或手动执行

cpan -i File::Rename
Run Code Online (Sandbox Code Playgroud)

旧的独立版本可以在这里找到


男人重命名


这个工具最初是由 Perl 之父 Larry Wall 编写的。


pax*_*blo 6

sed命令

s/\(.\).\(.*\)/mv & \1\2/
Run Code Online (Sandbox Code Playgroud)

意味着要取代:

\(.\).\(.*\)
Run Code Online (Sandbox Code Playgroud)

有:

mv & \1\2
Run Code Online (Sandbox Code Playgroud)

就像常规sed命令一样.但是,括号&\n标记会稍微改变它.

搜索字符串匹配(并记忆为模式1)开头的单个字符,后跟单个字符,后跟字符串的其余部分(记为模式2).

在替换字符串中,您可以参考这些匹配的模式以将其用作替换的一部分.您也可以将整个匹配部分称为&.

所以该sed命令正在做的是创建一个mv基于原始文件(对于源)和字符1和3以及之前的命令,有效地删除字符2(对于目标).它将为您提供以下格式的一系列行:

mv F00001-0708-RG-biasliuyda F0001-0708-RG-biasliuyda
mv abcdef acdef
Run Code Online (Sandbox Code Playgroud)

等等.