W katalogu znajduje się wiele plików rozpoczynających się od przedrostka fgh
, na przykład:
fghfilea
fghfileb
fghfilec
Chcę zmienić nazwę wszystkich, aby rozpocząć od prefiksu jkl
. Czy jest to jedno polecenie zamiast zmieniać nazwę każdego pliku osobno?
file
unix
rename
batch-rename
jww
źródło
źródło
Odpowiedzi:
Jest kilka sposobów, ale korzystanie
rename
będzie prawdopodobnie najłatwiejsze.Korzystanie z jednej wersji
rename
:Używając innej wersji
rename
(takiej samej jak odpowiedź Judy2K ):Powinieneś sprawdzić stronę podręcznika swojej platformy, aby zobaczyć, które z powyższych dotyczy.
źródło
rename
a następnie wyświetlasz składnię dla unixhelp.ed.ac.uk/CGI/man-cgi?nazwa jest drugarename
wydaje się być skryptem lub narzędziem specyficznym dla Linuksa. Jeśli w ogóle zależy Ci na przenośności, kontynuuj używaniesed
i pętli lub wbudowanego skryptu Perla.brew install rename
na OS X :)Oto jak
sed
imv
można ich używać razem do zmiany nazwy:Jak w poniższym komentarzu, jeśli w nazwach plików są spacje, może być konieczne umieszczenie cudzysłowu wokół funkcji podrzędnej, która zwraca nazwę, aby przenieść pliki do:
źródło
for f in fgh*; do mv "$f" "$(echo $f | sed 's/^fgh/jkl/g')"; done
touch fghfilea fghfileb fghfilec fghfile\ d
. Proponuję wziąć pod uwagę uwagi @DaveNelson.zmiana nazwy może nie być w każdym systemie. więc jeśli go nie masz, użyj powłoki w tym przykładzie w powłoce bash
źródło
sed
polecenie nie jest wymagane. Ten jest prostszy niż odpowiedź @ nik.sh
lub ogólnie w innych powłokach.Używając mmv :
źródło
;
w połączeniu z#1
. przykład:mmv ";fgh*" "#1jkl#2"
Można to zrobić na wiele sposobów (nie wszystkie będą działać na wszystkich systemach unixy):
ls | cut -c4- | xargs -I§ mv fgh§ jkl§
§ może zostać zastąpiony dowolnym, co uznasz za wygodne. Możesz to zrobić
find -exec
również, ale na wielu systemach zachowuje się to nieco inaczej, więc zwykle tego unikamfor f in fgh*; do mv "$f" "${f/fgh/jkl}";done
Surowe, ale skuteczne, jak mówią
rename 's/^fgh/jkl/' fgh*
Naprawdę ładne, ale zmiana nazwy nie jest obecna w BSD, który jest najczęściej spotykanym systemem unixowym.
rename fgh jkl fgh*
ls | perl -ne 'chomp; next unless -e; $o = $_; s/fgh/jkl/; next if -e; rename $o, $_';
Jeśli nalegasz na używanie Perla, ale w twoim systemie nie ma żadnej zmiany nazwy, możesz użyć tego potwora.
Niektóre z nich są nieco skomplikowane, a lista jest daleka od ukończenia, ale znajdziesz tutaj to, czego chcesz dla prawie wszystkich systemów uniksowych.
źródło
ls
wyjście nie powinno być analizowane i / lub przesyłaneźródło
Korzystanie
find
,xargs
ised
:Jest bardziej złożony niż rozwiązanie @ nik, ale pozwala rekursywnie zmieniać nazwy plików. Na przykład struktura
przekształciłby się w to,
Kluczem do jego działania
xargs
jest wywołanie powłoki z xargs .źródło
Aby zainstalować skrypt zmiany nazwy Perla :
Istnieją dwie nazwy, jak wspomniano w komentarzach w odpowiedzi Stephan202. Dystrybucje oparte na Debianie mają nazwę Perl . RedHat'a / rpm dystrybucje mieć C zmiany nazwy .
System OS X nie ma domyślnie zainstalowanego (przynajmniej w wersji 10.8), podobnie jak Windows / Cygwin.
źródło
Oto sposób na zrobienie tego za pomocą wiersza poleceń Groovy:
źródło
W systemie Solaris możesz wypróbować:
źródło
for file in $(find)
jest fundamentalnie błędna i nie mogą być korygowane z cytowania. W przypadkufind
zwrotów./file name with spaces
dostanieszfor
pętlę./file
,name
,with
, ispaces
, a nie ilość cytując wewnątrz pętli pomoże (lub nawet być konieczne).źródło
Ten skrypt działał dla mnie w przypadku rekurencyjnej zmiany nazw katalogów / plików, które prawdopodobnie zawierają białe spacje:
Zwróć uwagę na
sed
wyrażenie, które w tym przykładzie zastępuje wszystkie wystąpienia;
spacją. Powinno to oczywiście zostać zastąpione stosownie do konkretnych potrzeb.
źródło
Korzystanie z narzędzi StringSolver (Windows i Linux Bash ), które przetwarzają na przykładach:
Najpierw oblicza filtr na podstawie przykładów , w których dane wejściowe to nazwy plików i dane wyjściowe (ok i notok, dowolne ciągi znaków). Gdyby filtr miał opcję --auto lub został wywołany sam po tym poleceniu, utworzyłby odpowiednio folder
ok
i foldernotok
i wypchnąłby do nich pliki.Następnie za pomocą filtra
mv
polecenie jest półautomatycznym ruchem, który staje się automatyczny z modyfikatorem --auto. Korzystając z poprzedniego filtra dzięki opcji --filter, znajduje mapowanie odfghfilea
do,jklfilea
a następnie stosuje je do wszystkich filtrowanych plików.Inne rozwiązania jednowierszowe
Inne równoważne sposoby robienia tego samego (każda linia jest równoważna), więc możesz wybrać swój ulubiony sposób.
Rozwiązanie wieloetapowe
Aby dokładnie sprawdzić, czy polecenia działają dobrze, możesz wpisać następujące polecenie:
a gdy masz pewność, że filtr jest dobry, wykonaj pierwszy ruch:
Jeśli chcesz przetestować i użyć poprzedniego filtra, wpisz:
Jeśli transformacja nie jest tym, czego chciałeś (np. Nawet gdy
mv --explain
widzisz, że coś jest nie tak), możesz wpisać,mv --clear
aby zrestartować przenoszenie plików lub dodać więcej przykładów,mv input1 input2
gdzie input1 i input2 są innymi przykładamiKiedy jesteś pewny, po prostu pisz
i voila! Cała zmiana nazwy odbywa się za pomocą filtra.
ZASTRZEŻENIE: Jestem współautorem tego dzieła wykonanego do celów akademickich. Wkrótce może pojawić się funkcja produkująca bash.
źródło
O wiele łatwiej (na moim komputerze Mac) było to zrobić w Ruby. Oto 2 przykłady:
źródło
Za pomocą zmiany nazwy :
Usuń
--dry-run
flagę, gdy będziesz zadowolony, że wynik wygląda poprawnie.źródło
Moja wersja zmiany nazw plików masowych:
źródło
Poleciłbym użyć własnego skryptu, który rozwiązuje ten problem. Ma także opcje zmiany kodowania nazw plików i konwertowania łączenia znaków diakrytycznych na znaki o nieskomplikowanym składzie, problem ten zawsze mam przy kopiowaniu plików z komputera Mac.
źródło
stale over time
Działa to dla mnie przy użyciu wyrażenia regularnego:
Chciałem zmienić nazwę plików w ten sposób:
użyj wyrażenia regularnego [az | _] + 0 * ([0-9] +. ) gdzie ([0-9] +. ) jest podciągiem grupowym do użycia w poleceniu rename
Produkuje:
Inny przykład:
Produkuje:
Ostrzeżenie, bądź ostrożny.
źródło
Napisałem ten skrypt, aby wyszukać wszystkie pliki .mkv rekurencyjnie zmieniając nazwy znalezionych plików na .avi. Możesz dostosować go do swoich potrzeb. Dodałem kilka innych rzeczy, takich jak uzyskanie katalogu plików, rozszerzenia, nazwy pliku ze ścieżki pliku, na wypadek gdybyś musiał odwołać się do czegoś w przyszłości.
źródło
Ogólny skrypt do uruchomienia
sed
wyrażenia na liście plików (łączysed
rozwiązanie zrename
rozwiązaniem ):Wywołaj, przekazując skryptowi
sed
wyrażenie, a następnie dowolną listę plików, podobnie jak wersjarename
:źródło
Możesz także użyć poniższego skryptu. bardzo łatwo uruchomić go na terminalu ...
// Zmień nazwę wielu plików jednocześnie
Przykład:-
źródło
Kolejne możliwe rozszerzenie parametrów :
źródło