Переименовать файл с регулярным выражением [duplicate]

Я сделал небольшой скрипт для zsh, который использует xclip для этого:

#!/bin/zsh
export HISTFILE=~/.zsh_history
fc -R
fc -l | tail -n 2 | sed -n '1p' | sed 's/[0-9]*  //' | xclip -selection c

Этот скрипт копирует последнюю команду, которая была введена в оболочку / терминал в буфер обмена системы , Это не сработает на типичном удаленном сервере.

Я подумал, что мне понадобится всего пару минут, чтобы написать этот скрипт, но потребовалось много времени, чтобы заставить его работать, когда я наткнулся на этот путь zsh обрабатывает историю.

В этом случае tail -n 2 и first sed имеют дело с тем фактом, что команда для этого скрипта записывается в историю и поэтому получает две строки истории и удаляет последний.

Этот скрипт работает, и это была какая-то забавная головоломка, но мне действительно интересно, есть ли более простой или более элегантный способ сделать это с помощью zsh.

40
задан 19 April 2013 в 15:19

6 ответов

Решение вышеприведенного примера с использованием rename:

rename -v -n 's/file_\d{1,3}/upl/' file_*.png

Использование:

rename [options] [Perl regex search/replace expression] [files]

Из man rename:

-v, --verbose Verbose: print names of files successfully renamed. -n, --no-act No Action: show what files would have been renamed.

rename МОЖЕТ использовать regex в качестве аргументов.

То, что мы рассматриваем, - это контент между одинарными кавычками '.

Формула: s/(1)/(2)/, где (1) = шаблон поиска, и (2) = заменить шаблон.

Итак, rename и наслаждаться переименованием пакетного файла на основе шаблонов!

59
ответ дан 17 July 2018 в 22:28

Решение вышеприведенного примера с использованием rename:

rename -v -n 's/file_\d{1,3}/upl/' file_*.png

Использование:

rename [options] [Perl regex search/replace expression] [files]

Из man rename:

-v, --verbose Verbose: print names of files successfully renamed. -n, --no-act No Action: show what files would have been renamed.

rename МОЖЕТ использовать regex в качестве аргументов.

То, что мы рассматриваем, - это контент между одинарными кавычками '.

Формула: s/(1)/(2)/, где (1) = шаблон поиска, и (2) = заменить шаблон.

Итак, rename и наслаждаться переименованием пакетного файла на основе шаблонов!

59
ответ дан 23 July 2018 в 23:06

Это может быть сделано с небольшой магией расширения параметров bash!

for f in file_[0-9]*_*; do mv $f upl_${f#file_[0-9]*_}; done

file_[0-9]*_*; - Первый шаблон используется для прохождения через все файлы, начинающиеся с «file_anynumber_» ${f#file_[0-9]*_} - второй pattern file_[0-9]*_ используется в расширении параметра, который сообщает bash удалить «file_anynumber_» из нисходящей строки.

Для получения дополнительной информации о Parameter expansion:

man bash
5
ответ дан 17 July 2018 в 22:28

Если файлы находятся в папках с отдельными разделами, используйте переименование после поиска:

find -iname file_*.png -type f -exec rename -n 's/file_[0-9]{3}(.*\.png)/upl$1/' {} \;

после повторного переименования -n, чтобы удалить его, выполните! -)

например, вы связываете поиск и переименование.

Лично я использовал его для переименования заголовков источников .h в .hpp

find -iname *.h -type f -exec rename 's/(.*\.)h/$1hpp/' {} \;
4
ответ дан 17 July 2018 в 22:28

Это может быть сделано с небольшой магией расширения параметров bash!

for f in file_[0-9]*_*; do mv $f upl_${f#file_[0-9]*_}; done

file_[0-9]*_*; - Первый шаблон используется для прохождения через все файлы, начинающиеся с «file_anynumber_» ${f#file_[0-9]*_} - второй pattern file_[0-9]*_ используется в расширении параметра, который сообщает bash удалить «file_anynumber_» из нисходящей строки.

Для получения дополнительной информации о Parameter expansion:

man bash
5
ответ дан 23 July 2018 в 23:06
  • 1
    Обратите внимание, что в нем используются глобы, а не регулярные выражения, поэтому [0-9]* будет соответствовать одной цифре, за которой следует любая строка. Вероятно, есть лучший способ сопоставить только цифры, но я не могу придумать ничего сжатого. – wjandrea 31 October 2017 в 21:49

Если файлы находятся в папках с отдельными разделами, используйте переименование после поиска:

find -iname file_*.png -type f -exec rename -n 's/file_[0-9]{3}(.*\.png)/upl$1/' {} \;

после повторного переименования -n, чтобы удалить его, выполните! -)

например, вы связываете поиск и переименование.

Лично я использовал его для переименования заголовков источников .h в .hpp

find -iname *.h -type f -exec rename 's/(.*\.)h/$1hpp/' {} \;
4
ответ дан 23 July 2018 в 23:06

Другие вопросы по тегам:

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