【问题标题】:Script for renameing special characters files and directories重命名特殊字符文件和目录的脚本
【发布时间】:2014-05-12 07:01:07
【问题描述】:

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

?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/ 下。

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

【问题讨论】:

    标签: file unix directory find rename


    【解决方案1】:

    你可以这样做

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

    注意 之前的,这样您就可以在实际更改任何内容之前看到它的作用。否则以上:

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

    还要注意,文件类型不依赖于 linux 中的名称,但这不应更改任何文件扩展名,除非它们包含 ?

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

    【讨论】:

    • 谢谢 :) 写得很好,解释也很好。我想这对我有用:)
    • 像魅力一样工作!非常感谢你的队友:)
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢 :) 将在测试环境中进行测试。如果它按我的需要工作,那么我会接受答案:) 非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 2018-03-18
    • 2015-05-04
    • 1970-01-01
    相关资源
    最近更新 更多