У меня есть несчастье прийти из MS-DOS, но, по крайней мере, это заставляет меня понять, насколько мощнее Linux. Я работал над приведением Linux-Fu в нормальное состояние, но есть пара вещей, которые можно было бы сделать с DOS, но я не уверен, как лучше всего добиться этого с Linux:
Переименование нескольких файлов - с использованием двух подстановочных знаков
c:\> dir
Directory of c:\
file1.txt
file2.txt
file3.txt
file4.txt
c:\>rename *.txt *.bak
c:\> dir
Directory of c:\
file1.bak
file2.bak
file3.bak
file4.bak
Я знаю, что мог бы использовать find -exec
здесь, но возможно ли использовать более короткий синтаксис - возможно, mv
с некоторыми специальными флагами или синтаксисом? Я предполагаю, что ключ к этому - второй *
подстановочный знак, так как у linux не должно быть проблем с первым (т.е. я знаю, как выбрать файлы, которые я хочу переименовать, используя подстановочные знаки)
Переименование одного файла - с использованием одного подстановочного знака
c:\> dir
Directory of c:\
file1.txt
c:\>rename file1.txt *.bak
c:\> dir
Directory of c:\
file1.bak
Это было бы особенно полезно при переименовании длинных и громоздких имен файлов. Я подумал, что, возможно, я мог бы использовать mv file1.txt $1.bak
в конечном итоге, file1.txt.bak
что также было бы приемлемо, но я не уверен, что вы можете ссылаться на $1
параметр inline с помощью команды оболочки. Опять же, в этом конкретном случае просто удобно, как ms-dos убивает *
подстановочный знак, который будет использоваться как своего рода совпадение захвата / замены для части имени файла.
Фильтрация списков каталогов с помощью подстановочного знака
c:\> dir
Directory of c:\
file1.txt
file2.txt
file3.txt
file4.txt
text.txt
\temp (directory)
c:\> dir file*
Directory of c:\
file1.txt
file2.txt
file3.txt
file4.txt
c:\> t*
Directory of c:\
text.txt
\temp (directory)
Я не уверен, что правильный синтаксис для этого ls
, или если это вообще возможно. Если я сделаю что-то подобное ls t*
, я начну с каталогов t
. Мой обходной путь либо использовал, find . --max-depth 1 -iname "t*"
либо что-то в этом роде ls -al | grep t
- ни один из них не такой короткий и простой, как dir t*
есть.
Наконец, я знаю, что могу настроить псевдонимы, чтобы сделать эти длинные команды короче, но я хотел бы изучить некоторые из готовых linux-fu для этих вещей, потому что иногда вы подключены к удаленной системе или работаете на новой машине.
Так как же я могу mv
и ls
файлы так же, как я dir
и rename
файлы?
somefunc *.Ext
если этот шаблон не соответствует ни одному файлу, и поиграйтесь с цитированием, чтобы увидеть, удастся ли вам передать шаблон ( без его расширения) между функциями. Совет по безопасности: нигде не пользуйтесьrm
, экспериментируя с расширением глобуса / оболочки :-)Когда речь заходит о подстановочных знаках, имейте в виду, что они расширяются оболочкой. Приложение не знает, использовали ли вы подстановочные знаки или напечатали имена. Например, если вы печатаете
rename *.txt *.bak
, тоrename
команда видит что-то вродеrename file1.txt file2.txt existingfile.bak
. Этого недостаточно для продолжения.Я разберусь с вопросом о
ls
первом, потому что это проще. Если вам нужны только совпадающие имена, то вам это не нужноls
, потому что оболочка уже выполняет расширение.Если вы хотите получить больше информации о файлах, то передайте
-d
опциюls
, чтобы запретить выводить содержимое каталогов.Не существует стандартной утилиты для переименования файлов, потому что первые системы Unix не поставлялись с ней. Переносимый метод для переименования файлов использует цикл и немного многословен:
Существует несколько распространенных утилит для переименования файлов, ни одна из которых не гарантированно будет установлена в данной системе Unix, но все они просты в установке. Вот основные из них:
rename
изutil-linux
набора, доступного в любой не встроенной системе Linux (и нигде больше). В Debian и его производных (включая Ubuntu) эта команда вызываетсяrename.ul
. При условии, что не существует вхождения,.txt
кроме окончательного расширения, вы можете написатьrename
это скрипт на Perl , который Debian и его производные , как корабль/usr/bin/rename
. Вы можете переименовывать файлы в соответствии с произвольными командами Perl.mmv
, который может переименовывать, копировать и связывать файлы в соответствии с несколькими шаблонами, основанными на имени, и имеет много опций, касающихся того, что происходит, если целевое имя уже существует. Обратите внимание, что вы должны использовать кавычки для защиты символов подстановки от расширения оболочкой.zmv
является функцией zsh , доступной тогда и только тогда, когда вашей оболочкой является zsh. Он может соответствовать произвольным шаблонам zsh (поэтому вы можете сопоставлять имена файлов в соответствии с произвольными регулярными выражениями, а не только с подстановочными знаками, и вы можете сопоставлять файлы по другим критериям, таким как даты и размеры).zmv
Можно также скопировать и ссылку.Если у вас есть некоторый контроль над машинами, которые вы используете, я рекомендую использовать zsh в качестве оболочки (она имеет другие преимущества по сравнению с bash) и поместить эти строки в ваш
~/.zshrc
:noglob
это функция zsh, которая говорит оболочке не расширять символы подстановки в аргументе команды. Таким образом, вы можете написатьzmv *.txt \$1.txt
(вам всегда нужно защищать$
текст замены).источник