В 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
Моя цель - не указывать снова полный путь.
Я знаю, что те «примеры», которые я написал, не работают, но это просто представление о том, чего я хочу достичь.
Я не хочу заходить в каталог с помощью компакт-диска.
для одного файла попробуйте
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}
вряд ли расширится до того, что вы хотите. (это будет расширено до смешанного файла file.txt file1.txt.old file2.txt ...)
{txt,txt.old}
можно сократить до {,.old}
согласно комментарию
если имя каталога однозначно, можно использовать подстановочный знак.
mv *1/*2/d*/*.{,old}
для использования нескольких файлов rename
rename -n s/txt/old.txt/ dir1/dir2/dir3/file*.txt
падение -n
иметь эффективное переименование.
Команда rename
переименовывает все совпадающие файлы. Его основная цель - переименовать несколько файлов, но если выражение Perl соответствует только одному файлу, оно переименует только этот единственный файл. Для получения подробной информации и синтаксиса конкретного дистрибутива, пожалуйста, прочтите справочную страницу: man rename
.
Пример использования: переименуйте "/path/file.txt" в "/path/file.txt.old":
rename 's/file.txt/file.txt.old/g' /path/file.txt
Краткое обозначение (спасибо шаломбу):
rename 's/$/.old/' /path/file.txt
rename '$_.=".old"' /path/file.txt
Для пробного использования rename -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 dir1/dir2/dir3/ && mv file.txt file.txt.old)
Потому что ты 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
Решение с участием: 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"