Zmień nazwę wszystkich plików w folderze z prefiksem "Unix_"
Załóżmy, że folder zawiera dwa pliki
a.txt
b.pdf
następnie należy zmienić ich nazwę z jednego polecenia na
Unix_a.txt
Unix_b.pdf
Zmień nazwę wszystkich plików w folderze z prefiksem "Unix_"
Załóżmy, że folder zawiera dwa pliki
a.txt
b.pdf
następnie należy zmienić ich nazwę z jednego polecenia na
Unix_a.txt
Unix_b.pdf
Odpowiedzi:
Jeśli twoje nazwy plików nie zawierają białych znaków i nie masz żadnych podkatalogów, możesz użyć prostej for
pętli:
$ for FILENAME in *; do mv $FILENAME Unix_$FILENAME; done
W przeciwnym razie użyj wygodnego rename
polecenia (który jest skryptem Perla) - chociaż może nie być dostępne po wyjęciu z pudełka na każdym Uniksie (np. OS X nie jest dostarczany z rename
).
Krótkie omówienie na debian-administration.org:
Jeśli twoje nazwy plików zawierają spacje, są łatwiejsze w użyciu find
, w systemie Linux powinny działać następujące rzeczy :
$ find . -type f -name '*' -printf "echo mv '%h/%f' '%h/Unix_%f\n'" | sh
-printf
Niestety w systemach BSD nie ma takiej opcji. Ale GNU findutils powinno dać się zainstalować (np. Na Mac OS X z brew install findutils
).
$ gfind . -type f -name '*' -printf "mv \"%h/%f\" \"%h/Unix_%f\"\n" | sh
find
.
for f in *; do [[ -f ${f} ]] && mv ...; done
złapać tylko pliki ... (bez podkatalogów, linki itp.)
for FILENAME in *; do mv "$FILENAME" "Unix_$FILENAME"; done
działa poprawnie niezależnie od tego, jakie znaki znajdują się w nazwach plików. Przenosi również katalogi, gniazda, dowiązania symboliczne i inne typy plików; Przypuszczam, że to nie ma znaczenia.
.
przed wszystkimi moimi plikami
Wypróbuj rename
polecenie w folderze z plikami :
rename 's/^/Unix_/' *
Argument rename ( polecenie sed ) wskazuje na zastąpienie wyrażenia regularnego ^ przez Unix_ . Daszek (^) to znak specjalny, który oznacza początek wiersza .
's/^/.../'
to znaczy?
's/^/.../'
jest argumentem wyrażenia Perla dla polecenia zmiany nazwy
rename 's/^start_/run_' *
Myślę, że właśnie tego szukasz:
ls | xargs -I {} mv {} Unix_{}
Tak, jest prosty, ale elegancki i mocny, a także jednoliniowy. Możesz uzyskać ode mnie bardziej szczegółowe wprowadzenie na stronie: Zmień nazwę plików i katalogów (Dodaj prefiks)
ls
- może to prowadzić do problemów, jeśli w nazwach plików znajdują się spacje lub inne dziwne znaki.
Niedawno spotkałem się z tą samą sytuacją i znalazłem łatwiejsze wbudowane rozwiązanie. Udostępniam to tutaj, aby pomóc innym osobom szukającym rozwiązania.
W systemie OS X Yosemite firma Apple zintegrowała funkcje zmiany nazwy partii bezpośrednio w Finderze. Szczegółowe informacje dostępne są tutaj . Skopiowałem również poniższe kroki,
Zmień nazwę wielu elementów
Wybierz elementy, a następnie kliknij jeden z nich z wciśniętym klawiszem Control.
W menu skrótów wybierz Zmień nazwy elementów.
W wyskakującym menu poniżej opcji Zmień nazwy elementów folderu wybierz zamianę tekstu w nazwach, dodaj tekst do nazw lub zmień format nazwy.
Zastąp tekst: wprowadź tekst, który chcesz usunąć w polu Znajdź, a następnie wprowadź tekst, który chcesz dodać, w polu „Zamień na”.
Dodaj tekst: wprowadź w polu tekst, do którego chcesz dodać, a następnie dodaj tekst przed lub po bieżącej nazwie.
Format: wybierz format nazwy plików, a następnie umieść indeks, licznik lub datę przed lub po nazwie. Wprowadź nazwę w polu Format niestandardowy, a następnie wprowadź numer, od którego chcesz zacząć.
Kliknij Zmień nazwę.
Jeśli masz wspólny wzorzec w swoich plikach, możesz użyć opcji Zamień tekst, w przeciwnym razie Dodaj tekst również załatwi sprawę.
Możesz po prostu użyć -i
zamiast-I {}
ls | xargs -i mv {} unix_{}
To również działa doskonale.
ls
- wyświetla wszystkie pliki w kataloguxargs
- akceptuje wszystkie pliki wiersz po wierszu dzięki tej -i
opcji{}
jest symbolem zastępczym dla wszystkich plików, niezbędnym, jeśli xargs
pobiera więcej niż dwa argumenty jako dane wejścioweKorzystanie z awk:
ls -lrt | grep '^-' | awk '{print "mv "$9" unix_"$9""}' | sh
-i
jest przestarzały, teraz jest po prostu-I
Działa również dla elementów ze spacjami i ignoruje katalogi
for f in *; do [[ -f "$f" ]] && mv "$f" "unix_$f"; done
Z rnm (musisz go zainstalować):
rnm -ns 'Unix_/fn/' *
Lub
rnm -rs '/^/Unix_/' *
PS: Jestem autorem tego narzędzia.
rename
nie działa dla mnie, ale rnm
działa.
Sytuacja:
Mamy w certificate.key
certificate.crt
środku/user/ssl/
Chcemy zmienić nazwę wszystkiego, co zaczyna się od certificate
docertificate_OLD
Jesteśmy teraz w środku /user
Najpierw wykonaj próbę z -n
:
rename -n "s/certificate/certificate_old/" ./ssl/*
Który zwraca:
rename(./ssl/certificate.crt, ./ssl/certificate_OLD.crt)
rename(./ssl/certificate.key, ./ssl/certificate_OLD.key)
Twoje pliki pozostaną niezmienione, to tylko test.
Rozwiązanie:
Kiedy jesteś zadowolony z wyniku testu, uruchom go naprawdę:
rename "s/certificate/certificate_OLD/" ./ssl/*
Co to znaczy:
`rename" s / SOMETHING / SOMETING_ELSE "PATH / FILES
Wskazówka:
Jeśli jesteś już na ścieżce, uruchom ją w ten sposób:
rename "s/certificate/certificate_OLD/" *
Lub jeśli chcesz to zrobić w dowolnym podkatalogu zaczynającym się od ss
do:
rename -n "s/certificat/certificate_old/" ./ss*/*
Możesz też:
rename -n "s/certi*/certificate_old/" ./ss*/*
Który zmienia nazwę wszystkiego, co zaczyna się od, certi
w dowolnym podkatalogu zaczynającym się od ss
.
Niebo jest granicą.
Pobaw się z regex i ZAWSZE testuj to PRZED za pomocą -n
.
OBEJRZYJ, ŻE TO NAWET ZMIENI NAZWY FOLDERÓW, KTÓRE PASUJĄ. Lepiej cd
do katalogu i zrób to tam. UŻYWAJ NA WŁASNE RYZYKO.
find -execdir rename
Spowoduje to zmianę nazw plików i katalogów za pomocą wyrażenia regularnego dotyczącego tylko basenames.
Więc dla prefiksu możesz zrobić:
PATH=/usr/bin find . -depth -execdir rename 's/^/Unix_/' '{}' \;
lub dotyczy tylko plików:
PATH=/usr/bin find . -type f -execdir rename 's/^/Unix_/' '{}' \;
-execdir
najpierw cd
s do katalogu przed wykonaniem tylko na basename.
Bardziej szczegółowo wyjaśniłem to pod adresem: Znajdź wiele plików i zmień ich nazwy w systemie Linux