Mam grupę plików, które mają :
(dwukropek) w nazwie. Muszę wymienić :
z -
(kreską).
Czy istnieje prosty sposób na zrobienie tego w skrypcie?
Przykładowa nazwa pliku: 2013-10-11:11:52:08_055456663_045585_.txt
Powinien wystarczyć prosty 1-liniowy (zakłada sh
powłokę kompatybilną z Posix ):
for f in *:*; do mv -v "$f" $(echo "$f" | tr ':' '-'); done
Wyjaśnienie:
for ... in ...; do ...; done
jest pętlą
*:*
dopasowuje wszystkie pliki i katalogi w bieżącym katalogu, które mają :
w swojej nazwie
f
jest przypisywany kolejno do każdej takiej nazwy pliku w pętli
mv
zmienia swój pierwszy argument na drugi; -v
(verbose) prosi go o wydrukowanie tego, co robi; ta opcja jest specyficzna dla GNU-utils , więc jest dostępna w systemie Linux, ale nie w systemie Solaris
echo
wypisuje swój argument na standardowe wyjście
tr
odczytuje standardowe wyjście i tłumaczy znaki zgodnie z dostarczoną mapą
Jeśli używasz bash , możesz uniknąć tworzenia dodatkowej powłoki ( $()
) z podprocesami ( tr
), zastępując $(...)
ją ${f//:/-}
.
for f in
Pętla ... to pętla, która iteruje wszystkie pliki w bieżącym katalogu, w których pliki muszą się zgadzać*:*
. (Co dzieje się z reżimami, które pasują?). Polecenie move to move oldname newname, w którym nowa nazwa jest generowana przez wykonanie powłoki za pomocą$( subshell here )
. Co tr, ...$(echo "$f" | tr ':' '-')
z"${f//:/-}"
i uniknąć powłoki w tle, rury i połączenia zewnętrznego programu. Myślę, że to bzdura, ale eh. Zobacz tutaj .Jak napisałem w innym poście,
rename
narzędzie może załatwić sprawę. Musisz tylko wpisaćrename s/:/-/ <files to rename>
To zastępuje każdy dwukropek myślnikiem we wszystkich nazwach plików na końcu, tj2013-10-*
Oto link do mojego innego postu
źródło
Jestem pewien, że profesjonalista UNIX mógłby to zrobić za pomocą bash, ale oto moja szybka i brudna wersja z ruby.
ustaw path_to_files na ścieżkę do twoich błędnie nazwanych plików. zapisz powyższy kod w pliku o nazwie rename.rb, a następnie:
źródło
Jeśli masz tylko jeden lub kilka plików, możesz dokonać zmiany nazwy:
p="201*"
.old_name=$(ls | grep $p)
.Zapisz nową nazwę pliku z niezbędnymi zamiennikami znaków:
Czyszczenie bonusów :
a. Jeśli ze względu na jednolitość chcesz zastąpić myślniki (
-
) wraz z dwukropkami (:
) znakami podkreślenia (_
), możesz to zrobić:b. Jeśli chcesz, aby
.txt
zniknął również ostatni znak podkreślenia (tuż przed ), ustawnew_name
zmienną jako:mv $old_name $new_name
Uwaga:
mv
nie powiedzie się, jeśli w nazwie znajduje się jakakolwiek nazwa pliku w operacji zmiany nazwyspaces
. W takim przypadku zawiń odpowiednie zmienne w cudzysłów, takie jak:mv "$old_name" $new_name
LUBmv $old_name "$new_name"
LUBmv "$old_name" "$new_name"
Jednowarstwowe
źródło
za pomocą zmiany nazwy :
źródło
rename
jest narzędziem, które jest wstępnie zainstalowane w wielu dystrybucjach systemu Linux. Ale myślę, że dla systemu Windows to narzędzie może być świetne.Może to być przesada, ale możesz zmienić nazwę dowolnego znaku specjalnego za pomocą skryptu pod linkiem podanym w tej odpowiedzi:
/superuser//a/858671/365691
źródło