Я сделал небольшой скрипт для 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.
Решение вышеприведенного примера с использованием 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 и наслаждаться переименованием пакетного файла на основе шаблонов!
Решение вышеприведенного примера с использованием 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 и наслаждаться переименованием пакетного файла на основе шаблонов!
Это может быть сделано с небольшой магией расширения параметров 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
Если файлы находятся в папках с отдельными разделами, используйте переименование после поиска:
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/' {} \;
Это может быть сделано с небольшой магией расширения параметров 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
Если файлы находятся в папках с отдельными разделами, используйте переименование после поиска:
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/' {} \;