Одна строка для рекурсивного преобразования нижнего регистра в верхний регистр для файлов, заканчивающихся определенным расширением - PullRequest
0 голосов
/ 15 декабря 2018

Я пытался заставить это работать в течение некоторого времени.Я вижу сообщения для поиска и замены в Perl рекурсивно, используя perl -pie, но я не могу заставить его работать.

Вот что у меня есть:

perl -pie 's/a-z/A-Z/g' *.ods

Это говорит о том, что нет совпадений.

Ответы [ 4 ]

0 голосов
/ 20 декабря 2018

Если вы хотите изменить имя файлов вместо содержимого, вот еще один способ, используя команды find и xargs и Perl-скрипт с именем rename (это пример сценарияпоставляется с Perl и доступен в Debian через пакет rename.

% find -type f -name '*.ods' | xargs rename -n 's!(.+/)(.+)!$1 . lc($2)!e'

Преимущество использования этого сценария в том, что вы можете сначала выполнить симуляцию (сухой режим) перед тем, как фактически изменить имена файлов, используяопция -n.Как только вы подтвердите, что результат соответствует вашим ожиданиям, вы снова запустите без опции -n.

Примеры файлов:

% find
.
./Sub1
./Sub1/FOUR.ODS
./Sub1/three.ods
./Sub1/Two.ods
./sub2
./sub2/five.ODS
./sub2/Five.ods
./One.ods

Пример вывода:

rename(./Sub1/Two.ods, ./Sub1/two.ods)
rename(./sub2/Five.ods, ./sub2/five.ods)
rename(./One.ods, ./one.ods)

Еще одна альтернатива - использование сценария perlmv , доступного в CPAN (установите его, например, cpanm -n App::perlmv).Этот скрипт прославлен в форме rename и поддерживает рекурсивный режим, поэтому вы можете пропустить, используя find и xargs:

% perlmv -d -R -e'$_ = lc if /\.ods$/' .

. -d предназначен для режима пробного запуска, -Rдля рекурсивного.Пример вывода:

INFO: chdir `/zpool_host_mnt/mnt/home/s1/tmp/ods/.` ...
DRYRUN: move `One.ods` -> `one.ods`
INFO: chdir `/zpool_host_mnt/mnt/home/s1/tmp/ods/Sub1` ...
DRYRUN: move `Two.ods` -> `two.ods`
INFO: chdir `/zpool_host_mnt/mnt/home/s1/tmp/ods/sub2` ...
DRYRUN: move `Five.ods` -> `five.ods`

Если вы уверены, что получили правильные результаты, удалите параметр -d.

0 голосов
/ 15 декабря 2018
  • -i принимает необязательный «аргумент» (расширение, используемое для резервного копирования).Если вам не нужна резервная копия, вам нужно поместить пробел после того, как -i.
  • s/a-z/A-Z/g заменит все вхождения строки a-z на строку A-Z.

Исправление:

perl -i -pe'tr/a-z/A-Z/' *.ods
0 голосов
/ 16 декабря 2018

Приведенные выше примеры будут работать с содержимым файла и именем файла.Хотя вы действительно можете использовать Perl для достижения того, чего вы хотите, я бы посоветовал просто использовать сам bash, предполагая, что это вариант.

Если вы действительно хотите использовать Perl для этого, я бы сделал скрипт против одного.-liner:

Пример Perl

#!/usr/bin/env perl

use strict;
use warnings;

sub rename_file_extensions {
    my ( $dir, $orig_ext, $new_ext ) = @_;
    chdir($dir) or die "Can't chdir to $dir $!";
    opendir my $dh, $dir or die "Couldn't opendir: $!\n";
    for my $file ( readdir $dh ) {
        if ( -d $file && $file !~ /^\.+$/ ) {
            rename_file_extensions( "$dir/$file", $orig_ext, $new_ext );
        }
        else {
            if ( ( my $txt = $file ) =~ s/$orig_ext$/$new_ext/ ) {
                rename( $file, $txt ) or die "Can't rename: $!";
            }
        }
    }
    closedir $dh;
}

rename_file_extensions( $ARGV[0], $ARGV[1], $ARGV[2] );

Сценарий, приведенный выше, будет называться perl script.pl /path_to_files ods ODS.Он будет проходить через все каталоги в / path_to_files;переименование каждого экземпляра file.ods в file.ODS.

Пример только для Bash

find . -name "*.ods" -exec bash -c 'mv "$1" "${1%.ods}".ODS' - '{}' \;

Cheers

0 голосов
/ 15 декабря 2018

Это может сделать это.

perl -p -i -e 'tr/a-z/A-Z/' *.ods

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...