我正在寻找一个脚本来重命名其中包含特殊字符的文件和目录。 我的档案:
?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 / 下。
因此,在这种情况下,我只需要在文件名和目录名中重命名问号,但不要将其移动到其他地方或丢失任何其他字符或文件类型。我一直在谷歌寻找答案,但没有找到一个。我知道它可以通过查找和重命名来完成,但是无法克服脚本的复杂性。有人可以帮帮我吗?
答案 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//\?/}"' {} \;
请注意echo之前的mv,以便在实际更改任何内容之前查看其功能。除此之外:
?
(?
相当于*
的单个字符版本,因此需要进行转义){}
作为第一个参数传递(因为没有脚本名称$0
而不是$1
)${0//\?/}
在bash中执行参数展开,无需替换所有出现的?
。 另请注意,文件类型不依赖于linux中的名称,但除非它们包含?
,否则不应更改任何文件扩展名。
此外,如果符号链接包含?
,也会重命名符号链接(不清楚是否预期会出现问题)。