Найшвидший спосіб перейменувати файли, не перебираючи шлях до каталогу


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}

4
просто - найкраще!
Брайам

2
дивовижне використання розширення в оболонці геніально!
harish.venkat

3
Це є дивним, але на самому справі загадковим. Це працює, але на перший погляд я б подумав, що він робить щось інше: переміщує два файли кудись. Я не думаю, що це чудова ідея, тим більше, що існує набагато краще рішення rename.
йо

4
@tohecz: Чому це криптовалюта? Це особливість оболонки, і кожен може знати це, прочитавши сторінку man shell. І я не думаю rename, що це краще рішення, тому що renameніколи не вимагайте від вас змінити існуючий файл чи ні.
cuonglm

1
@Gnouc ти людина.
початківець

20

Ви також можете використовувати rename(частина пакету util-linux).

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

Докладніше див. На сторінці перейменування людини .


+1 Це зрозумілий спосіб, як це зробити, набагато краще, ніж покладатися на {a,b}функціональність оболонок .
йо

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 )

Ні. Це не працює для мене!
Хамед Камрава

Це спрацює, якщо ви видалите sudoдеталь.
Cthulhu

1
@Cthulhu Так ваше право. Але чому не працює sudo?
Хамед Камрава

2
@HamedKamrava Можливо, тому що sudoвін інтерпретує ~як домашній каталог кореня.
Cthulhu

Ви можете , але не . Дивіться , чому диск являє собою оболонку вбудований І ви не можете.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щоб перечитати файл init, і ви можете зробити:

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,}

Примітка. Ще на тему "Найшвидший спосіб перейменувати файли без повторного введення шляху dir"


1

Так. Якщо ви використовуєте bash, ви робите sudo pushd ~/folder/subfolder/ && sudo mv ./file.txt ./file.sh && popd.

Що насправді більше і може вийти з ладу, якщо ви втратили дозволи на доступ до оригінального каталогу, коли це зробили popd.


1
Який сенс pushdі popdтут? Як це краще, ніж cd ~/folder/subfolder/ && sudo mv file.txt file.sh?
тердон

1
Справа в тому, що ви після команди повертаєтеся до папки, яку ви запустили, а не в жодній підпапці. Альтернативою pushd popdє використання cdта повернення назад cd -.
jofel

Здавалося, що запитуючий заявляв про намір не змінювати робочий каталог, і 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)тому що запуск в допоміжній оболонці подбає про зміни каталогу автоматично.
Мікко Ранталайнен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.