在mac上移动和重命名文件

时间:2013-08-06 17:38:58

标签: macos perl terminal directory rename

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

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

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

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

谢谢!

4 个答案:

答案 0 :(得分:2)

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

Mac OS X还附带Automator

你应该选择什么?

  • 如果你真的非常,真的有兴趣学习编程,我会建议你从Bash开始。 BASH就是所谓的命令shell 。如果在提示符下键入命令,则会执行该命令。 Unix shell是一个功能强大的工具,BASH shell包含许多可以使用的控制结构。在BASH中,您可以使用find命令和mv命令并编写循环来执行您想要的操作。

    Shell脚本的功能有限。它们不是全服务语言,也不为此道歉。如果您需要多于几行或更复杂的控件,则应切换到脚本语言。

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

  • Perl是一种很好的语言,因为它的大部分语法结构都来自shell脚本语言。尽管你听说过,Perl仍然是一种非常受欢迎的语言。我发现人们比Python更快地获取Perl,因为它的语法规则更宽松,而且不必面向对象。这也是Perl的一个主要问题。大多数Perl程序员从未经历过基本的黑客攻击阶段,而Perl因其庞大的Perl脚本数量而难以维护。

  • Ruby并不像Perl或Python那样受欢迎,但它有它的粉丝。 Ruby的强大功能是称为 Ruby on Rails Rails 是一个编程框架,允许您快速构建基于Web的应用程序。首先应该学习Ruby,然后学习Rails组件。

  • PHP用作将网络固定在一起的粘合剂。我相信随着新的网络开发平台的出现,它的受欢迎程度近年来一直在下降。 PHP是编程的暴民规则。与所有其他语言不同,它没有一个单一的冠军来塑造语言,并且已经形成了很多碎屑。它很草率,很难维护 。
    尽管如此,它仍然是许多基于Web的论坛和内容管理系统(如Joomla)的基础。毕竟,PHP被设计为生活在网页内部。

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

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

答案 1 :(得分:1)

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

答案 2 :(得分: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);

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

答案 3 :(得分: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);
}