Odpowiedzi:
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//:/-}
.
$(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 .txt
zniknął również ostatni znak podkreślenia (tuż przed ), ustaw new_name
zmienną jako:
new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./')
mv $old_name $new_name
Uwaga: mv
nie 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 "-" *
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:
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, ...