Linux mv-файл с длинным именем

В 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 в каталог.

19
задан 21 January 2018 в 22:10
7 ответов

для одной попытки файла

mv dir1/dir2/dir3/file.{txt,txt.old}

, где конструкция X{a,b} расширяется до Xa Xb, вы можете получить предварительный просмотр с помощью

echo dir1/dir2/dir3/file.{txt,txt.old}

, чтобы посмотреть, подходит ли она вам.

примечание:

  1. что для нескольких файлов

    mv dir1/dir2/dir3/file{1,2,3}.{txt,txt.old}
    

вряд ли распространится на то, что ты хочешь. (это расширится до смешанного файла.txt file1.txt.old file2.txt ...)

  1. {txt,txt.old} может быть сокращено до {,.old} согласно комментарию

  2. , если имя каталога однозначно, можно использовать wildcard.

    mv *1/*2/d*/*.{,old}
    

для использования нескольких файлов переименовать

rename -n s/txt/old.txt/ dir1/dir2/dir3/file*.txt 

сбросить -n, чтобы иметь действительное переименование.

45
ответ дан 2 December 2019 в 20:12

Решение, включающее: 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"
0
ответ дан 2 December 2019 в 20:12

Для одноразового случая, если я не хочу менять свою текущую директорию, я могу просто использовать подоболочку:

(cd dir1/dir2/dir3/ && mv file.txt file.txt.old)

Потому что вы cd внутри подоболочки, вы не изменили свою директорию в вашей настоящей оболочке

.
4
ответ дан 2 December 2019 в 20:12

Команда переименовывает все совпадающие файлы. Ее основное назначение - переименовать несколько файлов, но если выражение 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/

6
ответ дан 2 December 2019 в 20:12

Мне нравится решение @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

Примечания:

  • Это синтаксис bash, вы можете использовать другую оболочку
  • mymv может быть любой разумной строкой, я использовал mymv для "моего хода".
  • Определение функции можно поместить в ваш .bash_profile

Другое:

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.

.
4
ответ дан 2 December 2019 в 20:12

Если вы хотите войти в подкаталог, чтобы сократить команду mv, но хотите вернуться в текущий каталог после этого, есть два способа сделать это. Первый - поместить cd и mv в поддиректорию (как уже предлагалось).

Другое - использовать pushd и popd для изменения каталогов:

pushd dir1/dir2/dir3/; mv file.txt file.txt.old; popd

Команда pushd аналогична cd, за исключением того, что она сначала выталкивает имя текущей директории в стек. popd удаляет верхнее имя из стека и изменяет его на этот каталог.

.
2
ответ дан 2 December 2019 в 20:12

Я бы просто сделал

cd dir1/dir2/dir3/
mv file.txt file.txt.old
cd ~- # go to the most recent directory
2
ответ дан 2 December 2019 в 20:12

Теги

Похожие вопросы