W Linuksie czasami zmieniam nazwy plików w ten sposób:
mv dir1/dir2/dir3/file.txt dir1/dir2/dir3/file.txt.old
Zauważ, że chcę po prostu zmienić nazwę pliku, a nie przenieść go do innego katalogu.
Czy istnieje polecenie, które pozwoliłoby mi wykonać skróconą wersję tego polecenia? Mam na myśli coś takiego:
mv dir1/dir2/dir3/file.txt file.txt.old
a może nawet coś takiego (aby po prostu dołączyć do nazwy):
mv dir1/dir2/dir3/file.txt {}.old
Moim celem nie jest ponowne podawanie pełnej ścieżki.
Wiem, że te „przykłady”, które napisałem, nie działają, ale to tylko pomysł na to, co chcę osiągnąć.
Nie chcę wpuszczać cd do katalogu.
linux
filesystems
files
mv
santiago arizti
źródło
źródło
(cd dir1/dir2/dir3 && exec mv file.txt{,.old})
ma efektywnie taką samą wydajność jak kod bez podprocesu, ponieważexec
unikafork()
ingerencji podczas zewnętrznego wywoływania polecenia, więc masz dokładnie jedno rozwidlenie.Odpowiedzi:
dla pojedynczego pliku spróbuj
gdzie
X{a,b}
konstrukcja rozwija sięXa Xb
, możesz uzyskać podgląd za pomocąaby sprawdzić, czy pasuje do twoich potrzeb.
Uwaga:
to dla wielu plików
jest mało prawdopodobne, aby rozwinąć się do tego, czego chcesz. (rozwinie się to do pliku file.txt plik1.txt.old plik2.txt ...)
{txt,txt.old}
można skrócić do{,.old}
jak w komentarzujeśli nazwa katalogu jest jednoznaczna, można użyć znaku zastępczego.
do użytku z wieloma plikami
rename
upuść,
-n
aby mieć skuteczną zmianę nazwy.źródło
mv dir1/dir2/dir3/file.txt{,.old}
również nie działa, a nawet być krótszy?Polecenie
rename
zmienia nazwy wszystkich dopasowanych plików. Jego głównym celem jest zmiana nazwy wielu plików, ale jeśli wyrażenie Perla pasuje tylko do jednego pliku, wówczas zmieni nazwę tylko tego jednego pliku. Aby uzyskać szczegółowe informacje i distro składni konkretnego proszę przeczytać stronę man:man rename
.Przykładowe użycie: zmień nazwę „/path/file.txt” na „/path/file.txt.old”:
rename 's/file.txt/file.txt.old/g' /path/file.txt
Krótsza notacja (dzięki shalomb):
Do użytku na sucho
rename -n
.Więcej przykładów i szczegółów można znaleźć na https://thepcspy.com/read/bulk-rename-files-in-ubuntu/
źródło
rename
polecenia o zupełnie innym zachowaniu..old
do nazwy pliku, prawdopodobnie wygodniej jest zrobićrename 's/$/.old/' /path/to/file.txt
lubrename '$_.=".old"' /path/to/file.txt
W przypadku jednorazowego przypadku, jeśli nie chcę zmieniać mojego bieżącego katalogu, mogę po prostu użyć podpowłoki:
Ponieważ
cd
znajdujesz się w podpowłoce, nie zmieniłeś katalogu w swojej rzeczywistej powłoceźródło
&& exec mv
- w ten sposób nie próbujesz zmienić nazwy, jeśli sięcd
nie powiedzie, iexec
zużywa podpowłokę, unikając w ten sposób obniżenia wydajności.&&
Przypadkiem jednorazowym, jak powiedziałem, nie martwiłbym się kosztem podpowłoki (bądź prosty: łatwiej jest pamiętać, jak to zrobić, ważniejsze jest IMO)Podoba mi się rozwiązanie @ archemar polegające na użyciu rozszerzenia {}, ponieważ możesz go użyć, gdy już uruchomiłeś linię poleceń. Oto kilka innych możliwości kompletności:
(cudzysłowy są konieczne tylko wtedy, gdy w nazwie masz spacje lub inne znaki dzielące słowa)
Uwagi:
mymv
może być dowolnym rozsądnym ciągiem, użyłem mymv do „mojego ruchu”.Inny:
ale
(od @Adam i @CharlesDuffy) jest prawdopodobnie lepszy w przypadku awarii płyty CD.
źródło
mmv
, istnieje już program o takiej nazwie.Jeśli chcesz wejść do podkatalogu w celu skrócenia
mv
polecenia, ale chcesz później wrócić do bieżącego katalogu, możesz to zrobić na dwa sposoby. Jednym z nich jest umieszczeniecd
iwmv
podpowłoce (jak już zasugerowano).Drugim jest używanie
pushd
ipopd
zmiana katalogów:pushd
Komenda jest niczymcd
, oprócz tego, że najpierw wypycha nazwę bieżącego katalogu na stosie.popd
usuwa górną nazwę ze stosu i przechodzi do tego katalogu.źródło
pushd
ipopd
są rozszerzeniami przeznaczonymi do użytku interaktywnego - POSIX wyraźnie je podaje jako „wyniki nie są określone”, a powłoka zbudowana do uruchamiania skryptów (tj. w minimalnym środowisku osadzonym) nie musi ich obsługiwać.Po prostu bym to zrobił
źródło
Rozwiązanie polegające na:
mv something{.txt,.txt.old}
używają „bashism”. Jeśli chcesz mieć bardziej przenośny sposób, używając wspólnych manipulacji zmiennymi:źródło
${var/text/replacement}
to sam bashizm.