Как переименовать несколько файлов с немного другим расширением?

Las herramientas de Unix suelen estar orientadas a líneas -y, por lo tanto, no hay forma de aplicar una expresión regular a varias líneas de entrada utilizando la caja de herramientas estándar.

sedse puede hacer para procesar el archivo de tal manera que pueda detectar las líneas que está buscando, pero hacemos esto estrictamente usando operaciones en líneas individuales:

$ sed -n '/^Text/{N;/^Text\nLine/=;D;}' file
10

Este script sedbusca la cadena Textal comienzo de una línea. Cuando lo encuentra, agrega la siguiente línea a su búfer con un \nen -en medio.

Si el búfer ahora coincide con ^Text\nLine, entonces el número de línea actual se genera usando el comando =en sed. El número de línea generado es el de la línea Lineen el archivo.

Tenga en cuenta que, si bien la segunda expresión regular parece coincidir en una nueva línea del archivo, no es así. Coincide con una nueva línea en su búfer interno, que colocamos allí usando el comando Ncuando leemos la siguiente línea del archivo.

Probablemente usaría esto en un bucle si desea aplicarlo a varios archivos:

for name in pattern; do
    printf 'Processing %s...\n' "$name"
    sed -n '/^Text/{N;/^Text\nLine/=;D;}' "$name"
done

donde patternsería un patrón de globbing de nombre de archivo ordinario que coincide con los archivos que le interesan.

2
28.07.2019, 19:15
3 ответа

Если у вас есть perl переименование Ларри Уолла

rename 's/[.]jpeg[0-9]*/.jpeg/' *.jpeg[0-9]*

если у вас есть только переименование Util -Linux, это не сработает.

Вы можете использовать цикл for в bash

for n in *.jpeg[0-9]*
do mv -i "$n" "${n%%.jpeg[0-9]*}.jpeg"
done

${var%%pattern}представляет собой расширение стандартного параметра , которое расширяется до значения varс удалением (самой длинной )замыкающей части, соответствующей pattern. Итак, если n— это foo.jpeg123, ${n%%.jpeg[0-9*}— это foo.(foo.jpeg1abcтакже приведет к foo.)

6
27.01.2020, 21:50

Я бы рекомендовал использовать zsh's zmvздесь, чтобы защититься от потенциальных конфликтов (, например, в текущем каталоге )есть файлы file.jpeg1и file.jpeg2перед выполнением . ] любое переименовать.

Вzsh:

autoload zmv # best in ~/.zshrc
zmv -n '(*.jpeg)<->' '$1'

Где<->(<x-y>диапазон чисел, совпадающий здесь без границ, )соответствует любой последовательности десятичных цифр, такой же, как [0-9]##.

(снять -nдля работы всухую -при удовлетворительном состоянии ).

3
27.01.2020, 21:50

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

for name in *.jpeg*; do
    mv -i -- "$name" "${name%.jpeg*}.jpeg"
done

Подстановка параметра ${name%.jpeg*}удалит .jpegи все, что следует за ним, из значения $name. Затем мы добавляем строку .jpegк результату этой подстановки, чтобы создать новое имя файла.

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

1
27.01.2020, 21:50

Теги

Похожие вопросы