簡體   English   中英

Perl:遞歸重命名所有文件和目錄

[英]Perl: Recursively rename all files and directories

我需要遞歸重命名每個文件和目錄。 我將空格轉換為下划線,並將所有文件/目錄名稱設置為小寫。 如何使以下腳本在一次運行中重命名所有文件? 目前,在轉換所有文件/目錄之前,需要多次運行腳本。 代碼如下:

#!/usr/bin/perl

use File::Find;

$input_file_dir = $ARGV[0];

sub process_file {
        $clean_name=lc($_);
        $clean_name=~s/\s/_/g;
        rename($_,$clean_name);
        print "file/dir name: $clean_name\n";
}
find(\&process_file, $input_file_dir);

您需要在傳遞的選項中指定bydepth => 1來查找或調用finddepth 來自perldoc文件::查找

bydepth

僅在報告所有條目后報告目錄的名稱。 入口點finddepth()是在find()的第一個參數中指定{ bydepth => 1 }的快捷方式。

但是, 您仍然需要決定如何處理命名沖突,因為如果目標存在,重命名將破壞目標

#!/usr/bin/perl

use strict; use warnings;
use File::Find;

finddepth(\&process_file, $_) for @ARGV;

如果您對其他方法持開放態度,那么這是一個Python解決方案

import os
for R,DIR,FILES in os.walk("/mypath",topdown=False):
    for file in FILES:
        newfile=file.lower().replace(" ","_")
        new_file_name=os.path.join(R,newfile)
        os.rename( os.path.join(R,file) , new_file_name)
    for dir in DIR:
        newdir=dir.lower().replace(" ","_")
        new_dir_name=os.path.join(R,newdir)
        os.rename( os.path.join(R,dir) , new_dir_name)

您可以在遍歷目錄之前重命名文件。

find({
        preprocess => sub {
            for (@_) {
                my $oldname = $_;
                $_ = lc;
                s/\s/_/g;
                rename $oldname => $_;
            }
            return @_;
        },
        wanted => sub {
            print "$File::Find::name was already renamed\n";
        },
    },
    @dirs
);

或者您可以延遲重命名,直到遍歷發生。

finddepth(sub {
        print "in $File::Find::dir, renaming $_\n";
        my $newname = lc;
        $newname =~ s/\s/_/g;
        rename $_ => $newname;
    },
    @dirs
);

你遇到的問題是因為

find目錄"Abc Def"
find wanted("Abc Def")電話wanted("Abc Def")
rename "Abc Def" => "abc_def"
find嘗試輸入"Abc Def" ,它不再存在
所以下面的一切都沒有得到處理

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM