Назад | Перейти на главную страницу

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

Моя цель - не указывать снова полный путь.

Я знаю, что те «примеры», которые я написал, не работают, но это просто представление о том, чего я хочу достичь.

Я не хочу заходить в каталог с помощью компакт-диска.

для одного файла попробуйте

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}
    

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

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

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

    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

Ноты:

  • Это синтаксис 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 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"