Czy ktoś może zasugerować, jak zmienić nazwę nazwy pliku:
head.body.date.txt
Do:
head_body_date.txt
Czy istnieje uniksowa instrukcja do zmiany nazwy w Unixie ?
Czy ktoś może zasugerować, jak zmienić nazwę nazwy pliku:
head.body.date.txt
Do:
head_body_date.txt
Czy istnieje uniksowa instrukcja do zmiany nazwy w Unixie ?
.tar.gz
jest to rozszerzenie? Witamy również w U&L!mv head.body.date.txt head_body_date.txt
. Jeśli masz inne ograniczenia lub prawdziwe przykłady, zaktualizuj swoje pytanie o te. W obecnej sytuacji nie jest jasne, czy pytanie dotyczy pliku o tej wyraźnej nazwie, pojedynczego katalogu, w którym wszystkie pliki mają określony format, czy też chcesz przeszukać hierarchię katalogów w poszukiwaniu określonych nazw i zmienić je.Odpowiedzi:
Iteruj po nazwach plików i użyj rozszerzenia parametru do konwersji:
Wzorzec ekspansji parametrów
${f//./_}
zastępuje wszystkie.
s literą_
s w nazwie pliku ($f
).Powyższe wykona próbę wstępną, aby umożliwić faktyczną zmianę nazwy, usuń
echo
:Jeśli chcesz poradzić sobie z dowolnym rozszerzeniem, nie tylko
.txt
:Po sprawdzeniu usuń
echo
dla faktycznego działaniaOgólny, dla dowolnej liczby kropek, co najmniej jeden:
źródło
for f in *.*; do ...; done
*.*
wzorca prosto w przykładzie, ponieważ teraz kod wygląda tak, jakby działał tylko ze stałą liczbą kropek.z
perl
opartymrename
\.[^.]+$(*SKIP)(*F)
pomiń ten wzór i poszukaj alternatywnych dopasowań|\./_/g
zastąpić wszystko.
z_
Lub używając negatywnego spojrzenia w przyszłość
Gdy będzie to w porządku, usuń
-n
opcjęźródło
Używa zamiany wyrażeń regularnych, aby znaleźć wszystkie oprócz ostatniej instancji
.
w nazwie pliku (nie przechwytywanie z wyprzedzeniem) i zastąpić je_
. Uogólnia na,*.*
jeśli chcesz.(ta konkretna wersja
rename
wydaje się być instalowana przezutil-linux
). UżywamUbuntu 12.04
(tak, poważnie przestarzała maszyna).źródło
bash
:źródło
mv --
, aby ochronić się przed „starymi” nazwami plików, które zaczynają się od-
. (2) Powinieneś wstawić$old
cudzysłowy ("$old"
), aby uchronić się przed „starymi” nazwami plików, które zawierają spacje lub znaki specjalne dla powłoki (jak*
i?
). (3) Twoja odpowiedź kończy się niepowodzeniem w nieco patologicznym przypadku, w którym rozszerzenie zawiera znak podkreślenia:head.body.date.t_xt
zostaje zmieniona nahead_body_date_t.xt
.Korzystanie
mv
,sed
arev
w jednym wierszu:Jeśli chcesz zastosować go do wszystkich
txt
plików w bieżącym rep, użycie globów wydaje się trudne ze względu na to, jakmv
działa, ale możesz zrobićfor
pętlę w jednowierszowym:Nieco dłużej, ale możesz dopasować kilka wzorów w swojej pętli!
źródło
$(ls …)
; po prostu zróbfor file in *.txt
. (2) Należy użyć więcej cytatów:mv "$file" "$(…)"
.rename
jak kilka innych sugerowanych w swoich odpowiedziach wydaje się prostsze ...Jest to tak proste, jak dla pojedynczego pliku na raz. Nie określasz, czy chcesz to robić rekurencyjnie w katalogu, czy w całym katalogu, aby było to najwygodniejsze i szybkie rozwiązanie.
źródło