Najszybszy sposób na zmianę nazwy plików, bez konieczności ponownego wpisywania ścieżki do katalogu


56

Wiem, jak zmienić nazwę plików w Uniksie:

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

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

~/folder/subfolder/fileDwukrotne powtórzenie zajmuje zbyt dużo czasu .

Czy jest szybszy sposób?

Odpowiedzi:


104

Jeśli powłoka obsługiwane Brace rozszerzeń (działa z csh, tcsh, ksh, zsh, bash, mksh, lksh, pdksh, yashz klamra rozwinąć włączona dzwoniąc yash --brace-expandlub ustawić w Interative powłoce z set -o brace-expandlub fish):

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

4
proste jest najlepsze!
Braiam

2
niesamowite wykorzystanie rozszerzenia w brylantach!
harish.venkat

3
To jest niesamowite, ale naprawdę tajemnicze. Działa, ale na pierwszy rzut oka wydaje mi się, że robi coś innego: przenosi gdzieś dwa pliki. Nie sądzę, że to świetny pomysł, zwłaszcza że istnieje znacznie lepsze rozwiązanie rename.
jo

4
@tohecz: Dlaczego jest tajemniczy? Jest to cecha powłoki i każdy może ją poznać, czytając stronę podręcznika powłoki. I nie sądzę, że renamejest to lepsze rozwiązanie, ponieważ renamenigdy nie proś o zastąpienie istniejącego pliku, czy nie.
cuonglm

1
@Gouc jesteś mężczyzną.
początkujący

20

Możesz także użyć rename(część pakietu util-linux).

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

Aby uzyskać więcej informacji, zobacz stronę man dotyczącą zmiany nazwy .


+1 Jest to wyraźny sposób, jak to zrobić, znacznie lepiej niż poleganie na {a,b}funkcjonalności powłok .
jo

5
W niektórych dystrybucjach Linuksa (takich jak Ubuntu) renamejest to zupełnie inny program oparty na perlu. Tam byś użył rename 's/txt$/sh/' ~/folder/subfolder/file.txt.
evilsoup

Na Debianie (i Ubuntu) jest też mmv.
ctrl-alt-delor

10

Wszystkie powyższe są dobre. Działa to również:

( cd ~/folder/subfolder && mv file.txt file.sh )

Nie. To nie działa dla mnie!
Hamed Kamrava

Będzie działać, jeśli usuniesz sudoczęść.
Cthulhu

1
@Cthulhu Tak, masz rację. Ale dlaczego nie działa sudo?
Hamed Kamrava

2
@HamedKamrava Prawdopodobnie dlatego, sudoże interpretuje ~jako katalog główny root.
Cthulhu

Można , ale nie . Zobacz dlaczego cd jest wbudowanym poleceniem powłoki i można w nie.sudomvcdsudo(
Ctrl-Alt-Delor

6

Nie. Musisz podać pełną ścieżkę do pliku, aby zmienić jego nazwę. Jedyną alternatywą jest przejście do folderu docelowego przed uruchomieniem mv:

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

Alternatywnie możesz napisać małą funkcję, która zmienia nazwę pliku w katalogu docelowym. Na przykład dodaj te wiersze do pliku inicjalizacji powłoki ( ~/.bashrcjeśli używasz bash):

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

Następnie otwórz nowy terminal lub po prostu uruchom, source ~/.bashrcaby ponownie odczytać plik init i możesz:

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

+1 dla lmv()funkcji. Nie wiedziałem tego :)
Hamed Kamrava

1
@HamedKamrava nikt tego nie wiedział. Właśnie to napisałem, to nie jest nic standardowego.
terdon

2
Wiem. Mam na myśli, że nie wiedziałem, że mogę napisać własną funkcję!
Hamed Kamrava

2

Po prostu, aby rozszerzyć użyteczność odpowiedzi cuonglm (NIE przyjmować uznania, ponieważ uwielbiam jego rozwiązanie), a jego odpowiedź jest poprawna.

Przypadek użycia polega na tym, że często chcemy przenieść plik w zdalną lokalizację (prawdziwy problem), np. /Folder/subfolder/configFile.dat TO configFile.dat.orig

Ta forma polecenia dodaje rozszerzenie pliku (nie zastępuje oryginalnego rozszerzenia)

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

Wyjaśnienie: „{, .orig}” oznacza zastąp (nic) na końcu nazwy pliku ((coś) „.orig”

LUB, aby usunąć rozszerzenie pliku (odwróć nazwę)

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

Uwaga: Nadal w temacie „Najszybszy sposób zmiany nazwy plików bez ponownego wpisywania ścieżki katalogu”


1

Tak. Jeśli używasz bash, robisz sudo pushd ~/folder/subfolder/ && sudo mv ./file.txt ./file.sh && popd.

Co jest w rzeczywistości większe i może się nie powieść, jeśli podczas wykonywania utracisz uprawnienia dostępu do oryginalnego katalogu popd.


1
Jaki jest sens pushdi popdtutaj? Jak to jest lepsze niż cd ~/folder/subfolder/ && sudo mv file.txt file.sh?
terdon

1
Chodzi o to, że jesteś za poleceniem z powrotem w folderze, który uruchomiłeś, a nie w żadnym podfolderze. Alternatywą pushd popdjest użycie cdi powrót cd -.
jofel

Pytający zdawał się twierdzić, że nie chce zmieniać katalogu roboczego i popdjest lepszy niż cd ../../, gdy jest dostępny.
41754

7
Użyj (cd /path/to/there && mv x y)wtedy (z podpowłoką)
Stéphane Chazelas

Naprawdę nie powinieneś stawiać sudowcześniej pushd. Tak więc powinno być pełne polecenie pushd ...dir && sudo mv old new && popd. Alternatywnie można to zrobić, (cd ...dir; sudo mv old new)ponieważ uruchomienie w podpowłoce automatycznie zajmie się zmianami katalogu.
Mikko Rantalainen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.