给出以下文件/目录结构:
/photos/1/original/filename1.jpg
/photos/1/thumb/filename1.jpg
/photos/2/original/filename2.jpg
/photos/2/thumb/filename2.jpg
/photos/3/original/filename3.jpg
/photos/3/thumb/filename3.jpg
...等。我正在寻找regexp将文件/目录结构转换为:
/photos/1/original.jpg
/photos/1/thumb.jpg
/photos/2/original.jpg
/photos/2/thumb.jpg
/photos/3/original.jpg
/photos/3/thumb.jpg
...等。我有脚本在ruby或perl中重命名文件...只是缺少正确的正则表达式。
提前感谢您的帮助!
答案 0 :(得分:2)
Perl解决方案
$newfn = $oldfn;
$newfn =~ s/(original|thumb)[^\.]*/$1/;
rename($oldfn, $newfn);
根据要求,假设/ photos / nn保持不变,匹配任何关键字,而不仅仅是“原始”或“拇指”:
$newfn = $oldfn;
$newfn =~ s?(photos/\d+/[^/]*)/[^\.]*?$1?;
rename($oldfn, $newfn);
如果目录为空,请调整此解决方案以删除目录
$newfn = $oldfn;
$newfn =~ s?(/photos/\d+/)([^/]*)/[^\.]*?$1$2?;
rename($oldfn, $newfn);
unlink($1$2);
我不确定当你取消链接时,如果目录不为空,这会怎么做。
答案 1 :(得分:2)
这是一个红宝石解决方案:
require 'fileutils'
old_file = "/photos/1/original/filename1.jpg"
new_file = old_file.sub(/(\d+)\/(\w+)\/.+(\.\w+)/, '\1/\2\3')
FileUtils.mv(old_file, new_file)
答案 2 :(得分:1)
调整Paul Tomblin的解决方案并提供更通用的重命名:
my $newfn = $oldfn;
$newfn =~ s%(/\d+/[^/]+)/[^/]+(\.[^./]+)$%$1$2%;
让我们用'x'选项扩展它:
$newfn =~ s%
( # start remembering
/\d+/ # /397/
[^/]+ # original, thumb, othername, ...
) # stop remembering
/ # directory
[^/]+ # filename within directory
(\.[^./]+)$ # remember extension matching to end of name
%
$1$2 # /397/original.png
%x;
(未经测试 - 可能存在拼写错误。)
答案 3 :(得分:0)
注意:虽然这不能直接回答您的问题,但我认为您仍然会觉得这很有用。 Linux和cygwin都有命令“rename
”和“mmv
”(多次移动),这可以满足这种需要。根据您的目录结构和请求,您可以轻松使用rename
命令来解决此问题:
cd /photos/1/original
rename filename original *.jpg
mv *.jpg ..
cd ../thumb
rename filename thumb *.jpg
mv *.jpg ..
cd ../2
.... (repeat for other directories)
您必须查看mmv
的手册页,但看起来您可以执行类似的操作(这是未经测试的):
cd /photos
mmv "*/original/filename*.jpg" "./#1/original#2.jpg"
mmv "*/thumb/filename*.jpg" "./#1/thumb#2.jpg"
这将重命名文件并将文件移动到您希望处理的整个文件树的所需目录中。双引号是强制性的。