pliki mv z wieloma `.` w nazwie pliku

1

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.txti WW_C.txttak, ż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 mvpolecenie 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ę?

Jason
źródło
Uwaga: w mv *.*.txt *_*.txttej *.*.txtczęści zachowuje się jak w echo *.*.txt; *_*.txtczęść zachowuje się jak w echo *_*.txt. Nie ma logicznego połączenia między pierwszą gwiazdką a trzecią, ani między drugą a czwartą.
Kamil Maciorowski

Odpowiedzi:

2

mv nie jest właściwym narzędziem.

Powinieneś użyć renamepolecenia:

rename 's/\./_/' *.*.txt

Ciąg 's/\./_/'oznacza „zastąpić pierwsze wystąpienie .z _na liście plików folling”.

Pan Shunz
źródło
O. Nie wiedziałem o poleceniu zmiany nazwy. Bardzo dobrze.
Lewis M
Łał. Zainstalowane renamei działało idealnie. Teraz do przeczytania man rename. Dziękuję bardzo.
Jason
2

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:

for f in *.*.txt; do
    mv ${f} $(echo ${f} | sed -e 's#\.#_#')
done

Polecenie sed zastępuje tylko pierwszą znalezioną kropkę znakiem podkreślenia. Wszelkie pozostałe kropki są nietknięte.

Mam nadzieję że to pomoże.

Lewis M.
źródło