Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 用于重命名特殊字符文件和目录的脚本_File_Unix_Directory_Find_Rename_Echo_Mv_Bash - Fatal编程技术网

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

File 用于重命名特殊字符文件和目录的脚本,file,unix,directory,find,rename,echo,mv,bash,File,Unix,Directory,Find,Rename,Echo,Mv,Bash,我正在寻找一个脚本重命名文件和目录,其中有特殊字符。 我的文件: ?rip?ev <- Directory - Juhendid ?rip?evaks.doc <- Document - ?rip?ev 2 <- Subdirectory -- t?ts?.xml <- Subdirectory file ?rip?ev我通常用Perl做这种事情: #!/usr/bin/perl sub procdir { chdir @_[0]; for (<*

我正在寻找一个脚本重命名文件和目录,其中有特殊字符。 我的文件:

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

?rip?ev我通常用Perl做这种事情:

#!/usr/bin/perl

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

procdir("top_directory");
#/usr/bin/perl
副主任{
chdir@[0];
对于(){
我的$oldname=$\ux;
重命名($oldname,$\如果s/\?//g;
procdir($)if-d;
}
chdir“.”;
}
procdir(“顶级目录”);

您可以这样做

find -name '*\?*' -exec bash -c 'echo mv -iv "$0" "${0//\?/}"' {}  \;
请注意之前的,以便在实际更改任何内容之前查看它的功能。除此之外:

  • 在名称中搜索
    相当于
    *
    的单字符版本,因此需要转义)
  • 执行bash命令,将
    {}
    作为第一个参数传递(因为没有脚本名称,所以它是
    $0
    而不是
    $1
  • ${0/\?/}
    执行参数扩展,将所有出现的
    替换为零
还请注意,在linux中,文件类型不依赖于名称,但这不应更改任何文件扩展名,除非它们包含


此外,如果符号链接包含
(不清楚这是否是问题所期望的)。

谢谢:)将在测试环境中测试。如果它能像我需要的那样工作,那么我会接受答案:)非常感谢!谢谢:)写得很好,解释得很好。我想这会对我有用:)就像一个符咒!非常感谢你,伙计:)
find -name '*\?*' -exec bash -c 'echo mv -iv "$0" "${0//\?/}"' {}  \;