Mam kilka plików, które otrzymuję o nazwach takich jak (wielu z nich robi to ręcznie codziennie):
AA.B.txt
WW.C.txt
i chcę, aby ich nazwy AA_B.txt
i WW_C.txt
tak, że istniejący kod SQL nadal działa zgodnie z oczekiwaniami. W tej chwili pliki te są ignorowane ze względu na format nazwa_pliku.letter.txt.
ls
działa i pokazuje mi te pliki:
$ ls -a *.*.txt
AA.B.txt*
ABR.A.txt*
ABR.B.txt*
ABR.C.txt*
ACT.A.txt*
Jednak podobne mv
polecenie kończy się niepowodzeniem:
$ mv *.*.txt *_*.txt
usage: mv [-f | -i | -n] [-v] source target
mv [-f | -i | -n] [-v] source ... directory
Jak dopasować wzór, który mam, do tego, czego chcę?
mv *.*.txt *_*.txt
tej*.*.txt
części zachowuje się jak wecho *.*.txt
;*_*.txt
część zachowuje się jak wecho *_*.txt
. Nie ma logicznego połączenia między pierwszą gwiazdką a trzecią, ani między drugą a czwartą.Odpowiedzi:
mv
nie jest właściwym narzędziem.Powinieneś użyć
rename
polecenia:Ciąg
's/\./_/'
oznacza „zastąpić pierwsze wystąpienie.
z_
na liście plików folling”.źródło
rename
i działało idealnie. Teraz do przeczytaniaman rename
. Dziękuję bardzo.Polecenie mv może mieć tylko jeden cel, albo zmiana nazwy jednego pliku (np mv AA.B.txt AA_B.txt) lub przenoszenia zestawu plików i katalogów do katalogu (np mv . Txt newdir ). Jeśli chcesz zmienić nazwę pliku, musisz to zrobić pojedynczo. Jakaś pętla.
Spróbuj czegoś takiego:
Polecenie sed zastępuje tylko pierwszą znalezioną kropkę znakiem podkreślenia. Wszelkie pozostałe kropki są nietknięte.
Mam nadzieję że to pomoże.
źródło