В 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
Моя цель - не указывать полный путь снова.
Я знаю те «примеры», которые я написал не работают, но это просто представление о том, чего я хочу достичь.
Я не хочу, чтобы мне приходилось вставлять cd в каталог.
для одной попытки файла
mv dir1/dir2/dir3/file.{txt,txt.old}
, где конструкция X{a,b}
расширяется до Xa Xb
, вы можете получить предварительный просмотр с помощью
echo dir1/dir2/dir3/file.{txt,txt.old}
, чтобы посмотреть, подходит ли она вам.
примечание:
что для нескольких файлов
mv dir1/dir2/dir3/file{1,2,3}.{txt,txt.old}
вряд ли распространится на то, что ты хочешь. (это расширится до смешанного файла.txt file1.txt.old file2.txt ...)
{txt,txt.old}
может быть сокращено до {,.old}
согласно комментарию
, если имя каталога однозначно, можно использовать wildcard.
mv *1/*2/d*/*.{,old}
для использования нескольких файлов переименовать
rename -n s/txt/old.txt/ dir1/dir2/dir3/file*.txt
сбросить -n
, чтобы иметь действительное переименование.
Решение, включающее: mv something {.txt, .txt.old }
используют "башизм".
Если вам нужен более переносимый способ, использующий общие манипуляции с переменными:
# rename all files "file*.txt" of directory /dir1/dir2/dir3 into file*.txt.old:
for f in dir1/dir2/dir3/file*.txt ; do
mv "$f" "${f/.txt/.txt.old}" # note there are no terminating "/"
done
# "${var/A/B}" is the content of var with the first occurence of "A" replaced by "B"
Для одноразового случая, если я не хочу менять свою текущую директорию, я могу просто использовать подоболочку:
(cd dir1/dir2/dir3/ && mv file.txt file.txt.old)
Потому что вы cd
внутри подоболочки, вы не изменили свою директорию в вашей настоящей оболочке
Команда переименовывает все совпадающие файлы. Ее основное назначение - переименовать несколько файлов, но если выражение Perl совпадает только с одним файлом, то она переименует только этот единственный файл. Для получения более подробной информации о синтаксисе дистрибутива, пожалуйста, ознакомьтесь со страницей manpage:
man rename
.
Пример использования: переименовать "/path/file.txt" в "/path/file.txt.old":
переименовать 's/file.txt/file.txt.old/g' /path/file. txt
Короткая запись (благодаря шалобу):
rename 's/$/.old/' /path/file.txt
rename '$_.=".old"' /path/file.txt
Для пробного запуска используйте переименование -n
.
Больше примеров и подробностей можно найти на https://thepcspy. com/read/bulk-rename-files-in-ubuntu/
Мне нравится решение @archemar по использованию расширения {}, потому что вы можете использовать его, когда уже запустили командную строку. Вот некоторые другие возможности для полноты:
F="dir1/dir2/dir3/file.txt" ; mv "$F" "$F.old"
(кавычки нужны только если у вас есть пробелы или другие разбивающие слова символы в названии)
mymv() {
mv "$1/$2" "$1/$3"
}
mymv dir1/dir2/dir3 file.txt file.txt.old
mymv dir5/dir6/dir7 file.txt file.txt.old
Примечания:
mymv
может быть любой разумной строкой, я использовал mymv для "моего хода". Другое:
cd dir1/dir2/dir3 ; mv file.txt file.txt.old ; cd -
но
(cd dir1/dir2/dir3/ && exec mv file.txt file.txt.old)
(из @Adam и @CharlesDuffy) возможно лучше в случае неудачи cd.
. Если вы хотите войти в подкаталог, чтобы сократить команду mv
, но хотите вернуться в текущий каталог после этого, есть два способа сделать это. Первый - поместить cd
и mv
в поддиректорию (как уже предлагалось).
Другое - использовать pushd
и popd
для изменения каталогов:
pushd dir1/dir2/dir3/; mv file.txt file.txt.old; popd
Команда pushd
аналогична cd
, за исключением того, что она сначала выталкивает имя текущей директории в стек. popd
удаляет верхнее имя из стека и изменяет его на этот каталог.
Я бы просто сделал
cd dir1/dir2/dir3/
mv file.txt file.txt.old
cd ~- # go to the most recent directory