Odpowiedzi:
Powinien wystarczyć prosty 1-liniowy (zakłada shpowłokę kompatybilną z Posix ):
for f in *:*; do mv -v "$f" $(echo "$f" | tr ':' '-'); done
Wyjaśnienie:
for ... in ...; do ...; donejest 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
mvzmienia 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//:/-}.
$(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 .
Jestem pewien, że profesjonalista UNIX mógłby to zrobić za pomocą bash, ale oto moja szybka i brudna wersja z ruby.
path_to_files = "/home/username/wrongnames/"
filenames = `ls #{path_to_files}`.split
filenames.each do |fn|
`mv #{path_to_files + fn} #{path_to_files + fn.gsub(/:/, "-")}`
end
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:
username@machinename$ ruby rename.rb
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:
new_name=$(ls | grep $p | sed 's/:/_/g') # Using 'sed'
OR
new_name=$(ls | grep $p | tr ':' '_') # Using 'tr'
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ć:
new_name=$(ls | grep $p | tr ':-' '_');
b. Jeśli chcesz, aby .txtzniknął również ostatni znak podkreślenia (tuż przed ), ustaw new_namezmienną jako:
new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./')
mv $old_name $new_name
Uwaga: mvnie powiedzie się, jeśli w nazwie znajduje się jakakolwiek nazwa pliku w operacji zmiany nazwy spaces. W takim przypadku zawiń odpowiednie zmienne w cudzysłów, takie jak: mv "$old_name" $new_name LUB mv $old_name "$new_name" LUB mv "$old_name" "$new_name"
1a: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | sed 's/:/_/g'); mv $old_name $new_name
1b: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':' '_'); mv $old_name $new_name
2: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':-' '_'); mv $old_name $new_name
3: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./'); mv $old_name $new_name
za pomocą zmiany nazwy :
$ renamer --find ":" --replace "-" *
renamejest 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:
for f inPę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, ...