Jak mogę zbiorczo zastąpić prefiks dla wielu plików?
Mam wiele plików takich jak
- TestSRConnectionContext.h
- TestSRConnectionContext.m
Chciałbym zmienić je wszystkie na
- CLConnectionContext.h
- CLConnectionContext.m
Jak mam to zrobić?
for name in TestSR*
do
newname=CL"$(echo "$name" | cut -c7-)"
mv "$name" "$newname"
done
Wykorzystuje to podstawienie polecenia bash do usunięcia pierwszych 6 znaków z wejściowej nazwy pliku przez cut
, poprzedza CL
wynik i zapisuje go w $newname
. Następnie zmienia nazwę starej nazwy na nową. Odbywa się to na każdym pliku.
cut -c7-
określa, że tylko znaki po indeksie 7 powinny być zwracane z danych wejściowych. 7-
oznacza zakres rozpoczynający się od indeksu 7 bez końca; to znaczy do końca linii.
Wcześniej korzystałem cut -b7-
, ale -c
powinienem go używać do obsługi kodowania znaków, które mogą mieć wiele bajtów na znak, np. UTF-8.
Powiedziałbym, że najprościej jest po prostu użyć
rename
polecenia, które jest wspólne w wielu dystrybucjach Linuksa. Istnieją dwie popularne wersje tego polecenia, więc sprawdź jego stronę podręcznika, aby znaleźć, którą masz:Jeśli chcesz używać wersji z util-linux-ng w systemie Debian, jest ona dostępna pod nazwą
rename.ul
źródło
rename
istnieje na wolności. Sprawdźrename
dokumentację lokalną, aby dowiedzieć się, jak korzystać z własnej .rename TestSR '' *
rename "\<pre\>" "" *
->Unterminated <> operator at (user-supplied code).
Rozszerzenie parametrów powłoki wystarcza do takich prostych transformacji. Podstawianie poleceń jest mniej wydajne ze względu na konieczność odrodzenia dodatkowych procesów (dla samego podstawienia polecenia i
cut
/sed
).źródło
TestSR*
znajdzie pliki,CL${f#TestSR}
będzie nową nazwą. Rzeczy po tekście#
zostaną zastąpione nazwą pliku (f
).Oto jeden ze sposobów:
ls *.{h,m}
-> Znajdź wszystkie pliki z rozszerzeniem .h lub .mn=CL
-> Dodaj prefiks CL do nazwy plikused -e 's/^Test//'
-> Usuwa przedrostek testowy z nazwy plikumv $a $n
-> Wykonuje zmianę nazwyźródło
Możesz spróbować z:
Aby
man bash
uzyskać szczegółowe informacje, patrz (sekcja „Rozszerzanie parametrów”).źródło
Cóż, nie było tak trudne, jak myślałem.
źródło
for f in TestSR*.[mh]
,for f in TestSR*.{m,h}
,for f in TestSR*.m TestSR*.h
.Jeśli potrzebujesz czegoś bardziej zgubnego, możesz to zrobić
źródło