-2

我的桌面上有一个名为“images”的文件夹。

里面是一堆名为“Flower_Shape”、“Smile_Shape”、“Dog_Shape”等的子文件夹,每个文件夹包含 3 张图像“Variant1.PNG”、“Variant2.PNG”和“Variant3.PNG”和然后一些其他文件格式被称为各种东西,但它们不以.png结尾,它们以“.psd”之类的东西结尾......

如何获取这数百个文件夹的所有内容,并将它们全部移动到 1 个文件夹中,同时将名称从“Variant1.png”更改为它所在文件夹的名称(例如“Variant1.png”)。文件夹“Flower_Shape”中的“png”将被重命名为“Flower_Shape-Variant1.png”),然后删除所有不以“.png”结尾的文件。

我的第一个主要问题是我会用什么语言来做这样的事情?会是PERL吗?在确定之后,有没有人有关于如何去做这件事的任何提示......我假设只是一个带有一些 if 语句的 for 循环应该是真正需要的,但我对 perl(或任何其他语言)一无所知处理在我自己的计算机上更改文件)

谢谢!

4

4 回答 4

2

Mac OS X 带有各种各样的脚本语言。它带有PerlPythonPHPRubyBASH

Mac OS X 还带有Automator

你应该选择什么?

  • 如果你真的对学习编程很感兴趣,我建议你从 Bash 开始。BASH 就是所谓的命令外壳。如果您在提示符下键入命令,它将被执行。Unix shell 是一个强大的工具,而 BASH shell 包含很多可以使用的控制结构。在 BASH 中,您可以使用find命令和mv命令并编写一个循环来执行您想要的操作。
    .
    Shell 脚本的功能有限。他们不应该是全方位服务的语言,也不会为此道歉。如果您需要超过几十行或更复杂的控件,则应切换到脚本语言。

  • 我是一名 Perl 程序员,但如果您真的对学习如何编程感兴趣,我建议您学习 Python。Python 可能是最流行的语言,它的使用肯定在增长。

  • Perl 是一种很好的语言,因为它的大部分语法结构都来自 shell 脚本语言。尽管您已经听说过,Perl 仍然是一种非常流行的语言。我发现人们使用 Perl 比 Python 更快,因为它的语法规则更宽松,而且它不必是面向对象的。这也是 Perl 的一个主要问题。大多数 Perl 程序员永远无法通过基本的黑客攻击阶段,而 Perl 以难以维护的语言而闻名,因为那里有大量糟糕的 Perl 脚本。

  • Ruby 没有 Perl 或 Python 那样流行,但它有它的粉丝。Ruby 的强大之处在于称为Ruby on RailsRails是一个编程框架,可让您快速构建基于 Web 的应用程序。您首先应该学习 Ruby,然后学习 Rails 组件。

  • PHP 曾经是把网​​络连接在一起的粘合剂。我相信近年来随着更新的 Web 开发平台的出现,它的受欢迎程度一直在下降。PHP是编程的暴民规则。与所有其他语言不同,它没有一个塑造语言的英雄,并且产生了很多碎片。它很草率,很难维护。
    .
    尽管如此,它仍然是许多基于 Web 的论坛和内容管理系统(如 Joomla)的基础。毕竟,PHP 被设计为存在于网页内部。

  • 如果你不想学习脚本编程,你应该试试 Automator。它带有图形用户界面,可以让您构建程序来执行各种任务。进入 Automator 的人已经用它做了一些了不起的事情。

不管你选择什么,你都可以在网上找到一些教程和信息,但是如果你真的想学习,你应该得到一些好的手册。O'Reilly and Associates在计算和互联网方面有着悠久的历史。Tim O'Reilly(公司背后的大脑)自 1978 年以来一直在制作计算机手册。我几乎所有的书都是 O'Reilly 的书。曼宁是另一个,还有几十个。在亚马逊将它们全部停业之前去一家真正的书店,并仔细阅读他们的书架以找到你喜欢的东西。

于 2013-08-06T19:05:56.167 回答
1

您必须将File::FindFile::Copy结合使用才能达到这些要求

于 2013-08-06T17:42:32.077 回答
0

如果你使用 perl,你应该查看 Path::Class 和 File:::Copy。这将处理您的路径解析。您想遍历文件系统(Path::Class::Dir->next 将是您的朋友),构建一个目标文件,如下所示:

my $curr_file = file('whatever_path...');
my $dest_dir = dir('some other path...');
my $dest_file = file($dest_dir, $curr_file->dir->basename . '-' . $curr_file->basename);

然后使用 File::Copy 移动:

move($curr_file, $dest_file);

首先查找这些方法/子例程及其用法;那么你只需要编写迭代代码。

于 2013-08-06T20:25:20.367 回答
0

我能够使用此代码完成此操作(并手动将“glob”函数中的值更改为不同级别///

#!/usr/bin/perl

foreach my $files (glob ('*/*/*')) {
    use strict;
    use File::Basename;
    use Cwd 'abs_path';

    my $f = "$files";  
    my $d = basename(dirname(abs_path($f)));

    my($file, $dir, $ext) = fileparse($files);

    my $initialName = "$dir$file";
    my $finalName = "$dir$d$file";

    print("$initialName --> $finalName \n");

    rename($initialName, $finalName);
}

然后就像使用移动功能将文件移动到新文件夹一样简单,如下所示:

#!/usr/bin/perl

foreach my $files (glob ('*/*/*')) {
    use strict;
    use File::Basename;
    use Cwd 'abs_path';
    use File::Copy;

    my $f = "$files";  
    my $d = basename(dirname(abs_path($f)));

    my($file, $dir, $ext) = fileparse($files);

    my $initialLocation = "$dir$file";
    my $finalLocation = "AllFiles/$file";

    print("$finalLocation\n");

    move($initialLocation,$finalLocation);
}
于 2013-08-06T20:26:26.400 回答