В Linux я иногда переименовываю файлы следующим образом:
mv dir1/dir2/dir3/file.txt dir1/dir2/dir3/file.txt.old
Обратите внимание, что я хочу просто переименовать файл, а не переместить его в другой каталог.
Есть ли команда, которая позволила бы мне сделать сокращенную версию этой команды? Я думаю что-то вроде:
mv dir1/dir2/dir3/file.txt file.txt.old
или даже что-то вроде (просто добавить к имени):
mv dir1/dir2/dir3/file.txt {}.old
Моя цель не состоит в том, чтобы снова указывать полный путь.
Я знаю, что те «примеры», которые я написал, не работают, но это просто идея того, чего я хочу достичь.
Я не хочу заходить в каталог.
linux
filesystems
files
mv
Сантьяго Аристи
источник
источник
(cd dir1/dir2/dir3 && exec mv file.txt{,.old})
имеет практически ту же производительность, что и код без подпроцесса, поскольку онexec
позволяет избежатьfork()
вызова во время внешнего вызова команды, поэтому в любом случае вы получаете ровно один форк.Ответы:
для одного файла попробуйте
где
X{a,b}
конструкция расширяется доXa Xb
, вы можете иметь предварительный просмотр, используячтобы увидеть, если это соответствует вашим потребностям.
нота:
что за несколько файлов
вряд ли расширится до того, что вы хотите. (это расширится до смешанного файла file.txt file1.txt.old file2.txt ...)
{txt,txt.old}
может быть сокращено{,.old}
в соответствии с комментариемесли имя каталога однозначно, можно использовать подстановочный знак.
для использования в нескольких файлах
rename
падение,
-n
чтобы иметь эффективное переименование.источник
mv dir1/dir2/dir3/file.txt{,.old}
будет также работать, и будет еще короче?Команда
rename
переименовывает все совпадающие файлы. Его основная цель - переименовать несколько файлов, но если выражение Perl соответствует только одному файлу, оно переименует только этот единственный файл. Для получения дополнительной информации и дистро синтаксиса конкретного пожалуйста прочитайте страницу руководства:man rename
.Пример использования: переименуйте "/path/file.txt" в "/path/file.txt.old":
rename 's/file.txt/file.txt.old/g' /path/file.txt
Более короткое обозначение (благодаря шаломбу):
Для пробного использования
rename -n
.Дополнительные примеры и подробности можно найти по адресу https://thepcspy.com/read/bulk-rename-files-in-ubuntu/.
источник
rename
команды с совершенно разным поведением..old
к имени файла, возможно, немного удобнее сделатьrename 's/$/.old/' /path/to/file.txt
илиrename '$_.=".old"' /path/to/file.txt
Для одноразового случая, если я не хочу менять свой текущий каталог, я мог бы просто использовать вспомогательную оболочку:
Поскольку вы
cd
внутри под-оболочки, вы не изменили свой каталог в вашей реальной оболочкеисточник
&& exec mv
- таким образом, вы не пытаетесь переименовать, если происходитcd
сбой, иexec
потребляет подоболочку, что позволяет избежать потери производительности.&&
Единовременным делом», как я уже сказал, я не буду беспокоиться о стоимости вспомогательной оболочки (будьте проще: возможность легко запомнить, как это сделать, важнее для ИМО)Мне нравится решение @ archemar использовать расширение {}, потому что вы можете использовать его, когда уже запустили командную строку. Вот некоторые другие возможности для полноты:
(кавычки необходимы только в том случае, если в названии есть пробелы или другие символы перевода слов)
Примечания:
mymv
может быть любая разумная строка, я использовал mymv для "моего хода".Еще один:
но
(от @Adam и @CharlesDuffy) возможно лучше в случае сбоя компакт-диска.
источник
mmv
, уже существует программа с таким названием.Если вы хотите войти в подкаталог, чтобы сократить
mv
команду, но потом хотите вернуться в текущий каталог, есть два способа сделать это. Одним из них является положитьcd
иmv
в подоболочку (как уже было предложено).Другой - использовать
pushd
иpopd
изменять каталоги:Команда
pushd
похожаcd
, за исключением того, что она сначала помещает имя текущего каталога в стек.popd
удаляет верхнее имя из стека и изменяет этот каталог.источник
pushd
иpopd
являются расширениями, предназначенными для интерактивного использования - POSIX явно перечисляет их как «результаты не определены», и оболочка, созданная для запуска сценариев (т. е. в минимальной встроенной среде), не должна их поддерживать.Я бы просто сделал
источник
Решение включает в себя:
mv something{.txt,.txt.old}
использование "bashism". Если вы хотите более портативный способ, используя обычные манипуляции с переменными:источник
${var/text/replacement}
это сам по себе башизм.