Самый быстрый способ переименования файлов без повторного ввода пути к каталогу

56

Я знаю, как переименовать файлы в Unix:

$ mv ~/folder/subfolder/file.txt ~/folder/subfolder/file.sh

     ^-------this part------^    ^------this part-------^

Повторение занимает слишком много времени ~/folder/subfolder/file.

Есть ли более быстрый способ?

Хамед Камрава
источник

Ответы:

104

Если ваша оболочка поддерживается Brace расширения (работает с csh, tcsh, ksh, zsh, bash, mksh, lksh, pdksh, yashс скобкой расширяющимся включены по телефону yash --brace-expandили набору в Interative оболочки set -o brace-expandили fish):

mv ~/folder/subfolder/file.{txt,sh}
cuonglm
источник
4
просто самое лучшее!
Брайам
2
потрясающее использование расширения в оболочке блестящий!
harish.venkat
3
Это является удивительным, но на самом деле загадочным. Это работает, но на первый взгляд я думаю, что это делает что-то другое: перемещает два файла куда-то. Я не думаю, что это отличная идея, тем более что есть гораздо лучшее решение rename.
'28
4
@tohecz: Почему это загадочно? Это особенность оболочки, и каждый может узнать ее, прочитав справочную страницу оболочки. И я не думаю, что renameэто лучшее решение, потому что renameникогда не просят вас переопределить существующий файл или нет.
cuonglm
1
@ Gnouc, ты мужчина.
начинающий
20

Вы также можете использовать rename(часть пакета util-linux).

rename .txt .sh ~/folder/subfolder/file.txt

Смотрите страницу переименования man для более подробной информации.

jofel
источник
+1 Это понятный способ сделать это, гораздо лучше, чем полагаться на {a,b}функциональность оболочек .
'28
5
В некоторых дистрибутивах Linux (таких как Ubuntu) renameэто совершенно другая программа на основе Perl. Там вы бы использовали rename 's/txt$/sh/' ~/folder/subfolder/file.txt.
evilsoup
На Debian (и Ubuntu) тоже есть mmv.
ctrl-alt-delor
10

Все вышеперечисленное хорошо. Это также будет работать:

( cd ~/folder/subfolder && mv file.txt file.sh )
Bjorn
источник
Нет, это не работает для меня!
Хамед Камрава
Это будет работать, если вы удалите sudoчасть.
Ктулху
1
@Cthulhu Да, ваше право. Но почему не работает с sudo?
Хамед Камрава
2
@HamedKamrava Вероятно, потому что с sudoним интерпретируется ~как домашний каталог корня.
Ктулху
Вы можете , но не . Смотрите , почему диск представляет собой оболочку встроенный И вы не можете.sudomvcdsudo(
Ctrl-Alt-Делор
6

Нет. Вам нужно указать полный путь к файлу, чтобы переименовать его. Единственная альтернатива - перейти в целевую папку перед запуском mv:

cd ~/folder/subfolder/
mv file.txt file.sh

В качестве альтернативы вы могли бы написать небольшую функцию, которая переименовывает файл в целевой каталог. Например, добавьте эти строки в файл инициализации оболочки ( ~/.bashrcесли вы используете bash):

lmv(){
    _path=$(dirname -- "$1")
    _target="${_path%/}/$2"
    mv -- "$1" "$_target"
}

Затем откройте новый терминал или просто запустите, source ~/.bashrcчтобы перечитать файл инициализации, и вы можете сделать:

lmv ~/folder/subfolder/file.txt file.sh
Тердон
источник
+1 за lmv()функцию. Я этого не знал :)
Хамед Камрава
1
@HamedKamrava никто не знал это. Я просто написал это, это не что-то стандартное.
Тердон
2
Я знаю. Я имею в виду, я не знал, что могу написать свою собственную функцию!
Хамед Камрава
2

Просто для того, чтобы расширить полезность ответа cuonglm (НЕ принимать кредит, поскольку я люблю его решение), и его ответ является правильным.

Вариант использования: мы часто хотим записать файл в удаленном месте (реальная проблема), например, /folder/subfolder/configFile.dat TO configFile.dat.orig

Эта форма команды добавляет расширение файла (не заменяя оригинальное расширение)

mv ~/folder/subfolder/file.txt{,.orig}

Объяснил: «{, .orig}» означает заменить (ничего) в конце имени файла на (что-то) «.orig»

ИЛИ удалить расширение файла (отменить переименование)

mv ~/folder/subfolder/file.txt{.orig,}

Примечание. Тем не менее, тема «Самый быстрый способ переименования файлов без повторного ввода пути к каталогу».

spikendu
источник
1

Да. Если вы используете bash, вы делаете sudo pushd ~/folder/subfolder/ && sudo mv ./file.txt ./file.sh && popd.

Который на самом деле больше и может потерпеть неудачу, если вы потеряли права доступа к исходному каталогу, когда вы сделали popd.

41754
источник
1
Какой смысл pushdи popdздесь? Чем это лучше чем cd ~/folder/subfolder/ && sudo mv file.txt file.sh?
Тердон
1
Дело в том, что вы после команды вернулись в папку, которую вы запустили, а не в любую подпапку. Альтернативой pushd popdявляется использование cdи возврат с cd -.
Джофель
Спрашивающий, похоже, заявил о намерении не менять рабочий каталог, и popdэто лучше, чем cd ../../когда это возможно.
41754
7
Используйте (cd /path/to/there && mv x y)тогда (с подоболочкой)
Стефан Шазелас
Вы действительно не должны ставить sudoраньше pushd. Так что полная команда должна быть pushd ...dir && sudo mv old new && popd. В качестве альтернативы это можно сделать, (cd ...dir; sudo mv old new)потому что запуск в subshell позаботится об изменениях каталога автоматически.
Микко Ранталайнен