Muszę rekurencyjnie zmienić nazwę całego drzewa folderów, aby nigdzie nie pojawiała się żadna wielka litera (jest to kod źródłowy C ++, ale to nie powinno mieć znaczenia).
Dodatkowe punkty za ignorowanie plików / folderów kontroli wersji CVS i Subversion. Preferowanym sposobem byłby skrypt powłoki, ponieważ powłoka powinna być dostępna na każdym Linuksie.
Pojawiło się kilka ważnych argumentów dotyczących szczegółów zmiany nazwy pliku.
Myślę, że pliki z tymi samymi małymi literami powinny zostać nadpisane; to problem użytkownika. Po wyewidencjonowaniu w systemie plików z ignorowaniem wielkości liter, nadpisze pierwszy również drugim.
Rozważyłbym znaki AZ i przekształciłbym je w az, wszystko inne po prostu wywołuje problemy (przynajmniej z kodem źródłowym).
Skrypt byłby potrzebny do uruchomienia kompilacji w systemie Linux, więc myślę, że zmiany w plikach kontroli wersji CVS lub Subversion powinny zostać pominięte. W końcu to tylko zwykła kasa. Może bardziej odpowiedni jest „eksport”.
ABCdef
,abcDEF
iaBcDeF
? Czy skrypt zmiany nazwy powinien przerwać, czy po prostu ostrzec i kontynuować? 2. Jak definiuje się małe litery w nazwach innych niż US-ASCII? Jeśli takie nazwiska mogą być obecne, czy należy najpierw sprawdzić i wykluczyć zaliczenie? 3. Jeśli prowadzisz operację zmiany nazwyOdpowiedzi:
Zwięzła wersja za pomocą
"rename"
polecenia:Pozwala to uniknąć problemów ze zmianą nazw katalogów przed plikami i próbą przeniesienia plików do nieistniejących katalogów (np.
"A/A"
Do"a/a"
).Lub bardziej szczegółową wersję bez użycia
"rename"
.PS
Ta ostatnia zapewnia większą elastyczność dzięki poleceniu ruchu (na przykład
"svn mv"
).źródło
then
linię zamkniętą na(mv "${SRC}" "${DST}.renametmp" && mv "${DST}.renametmp" "${DST}") || echo "${SRC} was not renamed"
.find my_root_dir -depth -exec rename -c {} \;
. Dodaj -f do zmiany nazwy, jeśli jesteś na systemie plików bez uwzględniania wielkości liter (np Mac)-T
zmv
polecenia.Jeszcze mniejszy lubię:
W systemach plików niewrażliwych na wielkość liter, takich jak HFS + w OS X , będziesz chciał dodać
-f
flagę:źródło
The renaming utility that comes by default with Ubuntu is a Perl program sometimes called prename
perl-rename
(i jest dostarczany przez pakiet o tej samej nazwie)źródło
find
.find .
wydaje się to naprawić.for f in `find .`; do mv -v "$f" "`echo $f | tr '[A-Z]' '[a-z]'`"; done
Po prostu wypróbuj poniższe, jeśli nie musisz dbać o wydajność.
źródło
-0
(to „zero”, bez kompresji) przełącznikzip -0 -r foo.zip foo/
.-0
kompresja była prawie natychmiastowa!Człowieku, wy chłopaki / dziewczyny lubicie zbytnio komplikować rzeczy ...
źródło
rename 'y/a-z/A-Z/' /tmp/*.jpg
->Can't rename /tmp/*.jpg /TMP/*.JPG: No such file or directory
, czyli spróbuj zmienić nazwę całej ścieżki zamiast tylko pliku.Większość powyższych odpowiedzi jest niebezpieczna, ponieważ nie dotyczą nazw zawierających dziwne znaki. Twój najbezpieczniejszym dla tego rodzaju rzeczą jest użycie
find
„s-print0
opcję, która będzie rozwiązać nazwy plików z ASCII NUL zamiast \ n.Oto skrypt, który zmienia tylko pliki, a nie nazwy katalogów, aby nie pomylić
find
:Przetestowałem to i działa z nazwami plików zawierającymi spacje, wszelkiego rodzaju cudzysłowy itp. Jest to ważne, ponieważ jeśli uruchamiasz jako root jeden z tych innych skryptów na drzewie, które zawiera plik utworzony przez
... Zastanów się ...
źródło
rename
zamiastmv
.Działa to, jeśli masz już lub skonfigurowałeś polecenie zmiany nazwy (np. Poprzez instalację brew na Macu):
źródło
brew install rename
--lower-case
? Tak nie jest, przynajmniej niestety w Arch Linux.rename
nie jest wbudowanym bashem. Jest to narzędzie zewnętrzne, którego składnia będzie się różnić w zależności od zainstalowanej wersji. Ta odpowiedź nie jest wystarczająca jako przenośne rozwiązanie „dla wszystkich systemów operacyjnych opartych na unixie”, jak twierdzono.rename
polecenie zawarte w najnowszej Fedorze (28), za pośrednictwemutil-linux-2.31
pakietu, nie ma--lower-case
opcji.Działa to na CentOS / Red Hat Linux lub innych dystrybucjach bez
rename
skryptu Perl:Źródło: zmień nazwy wszystkich plików z wielkich na małe litery
(W niektórych dystrybucjach domyślne
rename
polecenie pochodzi z util-linux i jest to inne, niekompatybilne narzędzie).źródło
Najprostszym podejściem, które znalazłem w systemie Mac OS X, było użycie pakietu zmiany nazwy z http://plasmasturm.org/code/rename/ :
źródło
Oto moje nieoptymalne rozwiązanie, używając skryptu powłoki Bash:
Wszystkie foldery mają poprawne nazwy, a
mv
nie zadają pytań, gdy uprawnienia się nie zgadzają, a nazwy folderów CVS nie są zmieniane (nazwy plików kontrolnych CVS w tym folderze są niestety nadal zmieniane).Ponieważ "find -depth" i "find | sort -r" zwracają listę folderów w możliwej do zmiany kolejności kolejności, wolałem używać "-depth" do wyszukiwania folderów.
źródło
Pierwotne pytanie dotyczyło ignorowania katalogów SVN i CVS, co można zrobić, dodając -prune do polecenia find. Np. Aby zignorować CVS:
[edytuj] Wypróbowałem to i osadzenie tłumaczenia pisanego małymi literami wewnątrz znaleziska nie działało z powodów, których właściwie nie rozumiem. Więc zmień to, aby:
Ian
źródło
Korzystanie z narzędzia do naprawy nazw plików Larry'ego Walla:
To jest tak proste, jak
(gdzie
fix
jest oczywiście powyższy skrypt)źródło
To jest mały skrypt powłoki, który robi to, o co prosiłeś:
Zwróć uwagę na akcję -depth w pierwszym znalezieniu.
źródło
Nie przenośny, tylko Zsh, ale dość zwięzły.
Najpierw upewnij się, że
zmv
jest załadowany.Upewnij się też, że
extendedglob
jest włączony:Następnie użyj:
Do plików i katalogów zapisywanych małymi literami, których nazwa nie jest CVS .
źródło
find -depth
drukuje każdy plik i katalog, z zawartością katalogu wypisywaną przed samym katalogiem.${f,,}
małe litery nazwy pliku.źródło
-depth
poprawki! To naprawdę szybkie rozwiązanie, ale oczywiście bez korzystania z-print0
opcji wyszukiwania nie jest najbardziej niezawodneW systemie MacOS
Zainstaluj
rename
pakiet,Posługiwać się,
To polecenie znajduje wszystkie pliki z
*.py
rozszerzeniem i konwertuje nazwy plików na małe litery.Na przykład,
źródło
-I
użyłeśxargs
tutaj opcji ?- I
Flaga nie jest obowiązkowe. Jest używany, gdy wykonujemy wiele poleceń zxargs
. Oto przykład użycia wielu poleceń w programiexargs
cat foo.txt | xargs -I % sh -c 'echo %; mkdir %'
Możesz uruchomić bez-I
podobnychfind . -iname "*.py" -type f | xargs -I% rename -c -f "%"
Użyj składu :
W systemie Windows emulacje, takie jak Git Bash , mogą zawieść, ponieważ system Windows nie rozróżnia wielkości liter pod maską. W tym celu dodaj krok, który
mv
jest plikiem, najpierw do innej nazwy, np. „$ Old.tmp”, a następnie do$new
.źródło
Długi, ale „Działa bez niespodzianek i instalacji”
Ten skrypt obsługuje nazwy plików ze spacjami, cudzysłowami, innymi nietypowymi znakami i Unicode, działa na systemach plików niewrażliwych na wielkość liter i większości środowisk Unix-y, które mają zainstalowane bash i awk (tj. Prawie wszystkie). Zgłasza również ewentualne kolizje (pozostawiając nazwę pliku wielkimi literami) i oczywiście zmienia nazwy zarówno plików i katalogów, jak i działa rekurencyjnie. Wreszcie jest wysoce adaptowalny: możesz dostosować polecenie find, aby wskazywało na pliki / katalogi, które chcesz, i możesz dostosować awk, aby wykonywać inne operacje na nazwach. Zauważ, że przez „obsługuje Unicode” mam na myśli, że rzeczywiście skonwertuje ich wielkość liter (nie ignoruj ich jak odpowiedzi, które używają
tr
).Bibliografia
Mój skrypt oparty jest na tych doskonałych odpowiedziach:
/unix/9496/looping-through-files-with-spaces-in-the-names
Jak przekonwertować ciąg na małe litery w Bash?
źródło
Działa to również dobrze na macOS:
źródło
Musiałem to zrobić w konfiguracji Cygwin w systemie Windows 7 i stwierdziłem, że mam błędy składniowe z sugestiami z góry, które próbowałem (chociaż mogłem przegapić działającą opcję). Jednak to rozwiązanie prosto z forów Ubuntu wyszło z puszki :-)
(Uwaga: wcześniej zastępowałem białe spacje podkreśleniami, używając:
)
źródło
W OS X
mv -f
pokazuje błąd „ten sam plik”, więc dwukrotnie zmieniam nazwę:źródło
W takiej sytuacji sięgnąłbym po Pythona, aby uniknąć optymistycznego zakładania ścieżek bez spacji i ukośników. Zauważyłem również, że
python2
zwykle jest instalowany w większej liczbie miejsc niżrename
.źródło
Jeśli używasz Arch Linux , możesz zainstalować
rename
pakiet) z,AUR
który zawierarenamexm
polecenie jako/usr/bin/renamexm
plik wykonywalny i stronę podręcznika wraz z nim.To naprawdę potężne narzędzie do szybkiej zmiany nazw plików i katalogów.
Konwertuj na małe litery
Konwertuj na WIELKIE litery
Inne opcje
W razie potrzeby możesz pobrać przykładowy plik Developers.mp3 stąd ;)
źródło
brew
na MacOS-l
wiąże się z utworzeniem dowiązania symbolicznego i-c
konwersją na małe litery, więc uważaj.Najpierw zmień nazwy katalogów od dołu do góry, sort -r (gdzie -depth nie jest dostępne), a następnie pliki. Następnie grep -v / CVS zamiast find ...- prune, ponieważ jest prostsze. W przypadku dużych katalogów f in ... może spowodować przepełnienie niektórych buforów powłoki. Użyj znajdź ... | podczas czytania aby tego uniknąć.
I tak, spowoduje to zbijanie plików, które różnią się tylko w przypadku ...
źródło
find YOURDIR -type d | sort -r
to zbyt duży problem. Chceszfind YOURDIR -depth -type d
. Po drugie,find -type f
MUSI zostać uruchomione po zmianie nazw katalogów.Nie próbowałem bardziej rozbudowanych skryptów wymienionych tutaj, ale żadna z pojedynczych wersji wiersza poleceń nie działała dla mnie na moim serwerze Synology NAS.
rename
jest niedostępna, a wiele odmianfind
kończy się niepowodzeniem, ponieważ wydaje się, że trzyma się starszej nazwy ścieżki, której nazwa została już zmieniona (np. jeśli znajdzie./FOO
po niej./FOO/BAR
, zmiana nazwy./FOO
na./foo
nadal będzie wyświetlana./FOO/BAR
mimo że ta ścieżka nie jest już prawidłowa) . Powyższe polecenie zadziałało dla mnie bez żadnych problemów.Poniżej znajduje się wyjaśnienie każdej części polecenia:
Spowoduje to znalezienie dowolnego pliku z bieżącego katalogu (przejdź
.
do dowolnego katalogu, który chcesz przetworzyć), używając wyszukiwania w pierwszej kolejności (np. Wyświetli listę./foo/bar
wcześniej./foo
), ale tylko dla plików zawierających wielkie litery.-name
Filtr stosuje się tylko do nazwy pliku podstawa, a nie pełną ścieżkę. Więc to będzie lista,./FOO/BAR
ale nie./FOO/bar
. To jest w porządku, ponieważ nie chcemy zmieniać nazwy./FOO/bar
. Chcemy jednak zmienić nazwę./FOO
, ale ta jest wymieniona później (dlatego-depth
jest ważna).To polecenie samo w sobie jest szczególnie przydatne do znajdowania plików, których nazwy chcesz zmienić. Użyj tego po wykonaniu pełnego polecenia zmiany nazwy, aby wyszukać pliki, które nadal nie zostały zastąpione z powodu kolizji nazw plików lub błędów.
Ta część odczytuje pliki wyprowadzone przez
find
i formatuje je wmv
poleceniu przy użyciu wyrażenia regularnego.-n
Opcja zatrzymujesed
drukowanie wejście, ap
komenda w poszukiwaniu i zamiany regex wyjść wymieniony tekstowych.Samo wyrażenie regularne składa się z dwóch przechwyceń: części aż do ostatniego / (czyli katalogu pliku) i samej nazwy pliku. Katalog pozostaje nienaruszony, ale nazwa pliku jest przekształcana na małe litery. Więc jeśli
find
wyjścia./FOO/BAR
, to się staniemv -n -v -T ./FOO/BAR ./FOO/bar
.-n
Opcjamv
pilnuje istniejących plików małe nie są nadpisywane.-v
Opcja sprawia, żemv
wyjście każda zmiana, która czyni (albo nie robić - jeśli./FOO/bar
już istnieje, to wysyła coś podobnego./FOO/BAR -> ./FOO/BAR
, zauważając, że żadna zmiana została dokonana).-T
Jest tutaj bardzo ważne - traktuje plik docelowy jako katalogu. Zapewni to, że./FOO/BAR
nie zostanie on przeniesiony,./FOO/bar
jeśli katalog istnieje.Użyj tego razem z,
find
aby wygenerować listę poleceń, które zostaną wykonane (przydatne do sprawdzenia, co zostanie zrobione bez robienia tego)To dość oczywiste. Kieruje wszystkie wygenerowane
mv
polecenia do interpretera powłoki. Możesz go zastąpićbash
powłoką lub dowolną powłoką, która Ci się podoba.źródło
Slugify Zmień nazwę (wyrażenie regularne)
Nie jest to dokładnie to, o co prosił PO, ale to, co miałem nadzieję znaleźć na tej stronie:
Wersja „slugify” służąca do zmiany nazw plików, tak aby były podobne do adresów URL (tj. Zawierają tylko znaki alfanumeryczne, kropki i myślniki):
źródło