用于重命名特殊字符文件和目录的脚本

时间:2014-04-01 13:13:57

标签: file unix directory find rename

我正在寻找一个脚本来重命名其中包含特殊字符的文件和目录。 我的档案:

?rip?ev <- Directory
 - Juhendid ?rip?evaks.doc <- Document
 - ?rip?ev 2 <- Subdirectory
 -- t?ts?.xml <- Subdirectory file

他们需要像这样:

ripev <- Directory
 - Juhendid ripevaks.doc <- Document
 - ripev 2 <- Subdirectory
 -- tts.xml <- Subdirectory file

我需要更改文件和文件夹,以便文件类型保持不变,例如.doc和.xml不会丢失。上次我重命名时它丢失了每个文件类型,在这种情况下文件被移动到母目录?rip?ev目录和子目录是空的。一切都位于母目录 / home / samba / 下。

因此,在这种情况下,我只需要在文件名和目录名中重命名问号,但不要将其移动到其他地方或丢失任何其他字符或文件类型。我一直在谷歌寻找答案,但没有找到一个。我知道它可以通过查找和重命名来完成,但是无法克服脚本的复杂性。有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:1)

我通常在Perl中做这种事情:

#!/usr/bin/perl

sub procdir {
  chdir @_[0];
  for (<*>) {
    my $oldname = $_;
    rename($oldname, $_) if s/\?//g;
    procdir($_) if -d;
 }
  chdir "..";
}

procdir("top_directory");

答案 1 :(得分:1)

你可以做这样的事情

find -name '*\?*' -exec bash -c 'echo mv -iv "$0" "${0//\?/}"' {}  \;

请注意之前的,以便在实际更改任何内容之前查看其功能。除此之外:

  • 在名称中搜索??相当于*的单个字符版本,因此需要进行转义)
  • 执行bash命令,将{}作为第一个参数传递(因为没有脚本名称$0而不是$1
  • ${0//\?/}中执行参数展开,无需替换所有出现的?

另请注意,文件类型不依赖于linux中的名称,但除非它们包含?,否则不应更改任何文件扩展名。

此外,如果符号链接包含?,也会重命名符号链接(不清楚是否预期会出现问题)。