Zmień nazwę wszystkich plików w folderze z prefiksem w jednym poleceniu


Odpowiedzi:


107

Jeśli twoje nazwy plików nie zawierają białych znaków i nie masz żadnych podkatalogów, możesz użyć prostej forpętli:

$ for FILENAME in *; do mv $FILENAME Unix_$FILENAME; done 

W przeciwnym razie użyj wygodnego renamepolecenia (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

-printfNiestety 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

@Matteo: Dzięki podpowiedź: zaktualizowałem moją odpowiedź ostrzeżeniem i dwoma przykładami z find.
miku

Również polecam for f in *; do [[ -f ${f} ]] && mv ...; donezłapać tylko pliki ... (bez podkatalogów, linki itp.)
twalberg

1
Jeśli cytujesz zmienne tak, jak powinieneś, to for FILENAME in *; do mv "$FILENAME" "Unix_$FILENAME"; donedział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.
Jonathan Leffler

W jakiś sposób dodało to .przed wszystkimi moimi plikami
nullability

75

Wypróbuj renamepolecenie 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 .


8
Czy mógłbyś wyjaśnić, co 's/^/.../'to znaczy?
mcont

@Matteo 's/^/.../'jest argumentem wyrażenia Perla dla polecenia zmiany nazwy
RoyalleBlue

to jest niesamowite! sugerowałbym dodanie folderu / *, ponieważ * jest trochę niebezpieczne, jeśli polecenie przypadkowo zostanie powtórzone w innym miejscu
System Rebooter

brew install rename @OliverPearmain
Felipe Plazas

Przykład zamiany przedrostka:rename 's/^start_/run_' *
DenisKolodin

35

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)


2
Uważaj na przetwarzanie danych wyjściowych ls- może to prowadzić do problemów, jeśli w nazwach plików znajdują się spacje lub inne dziwne znaki.
Jonathan Leffler

15

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

  1. Wybierz elementy, a następnie kliknij jeden z nich z wciśniętym klawiszem Control.

  2. W menu skrótów wybierz Zmień nazwy elementów.

  3. 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ąć.

  4. 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ę.


Świetnie - zaoszczędziłem dużo czasu!
user3000868

6

Możesz po prostu użyć -izamiast-I {}

ls | xargs -i mv {} unix_{}

To również działa doskonale.

  • ls - wyświetla wszystkie pliki w katalogu
  • xargs- akceptuje wszystkie pliki wiersz po wierszu dzięki tej -iopcji
  • {}jest symbolem zastępczym dla wszystkich plików, niezbędnym, jeśli xargspobiera więcej niż dwa argumenty jako dane wejściowe

Korzystanie z awk:

ls -lrt | grep '^-' | awk '{print "mv "$9" unix_"$9""}' | sh

-ijest przestarzały, teraz jest po prostu-I
JamPow

pomogło mi to w Debianie 8, Thaks
Abror Esonaliyev

2

Działa również dla elementów ze spacjami i ignoruje katalogi

for f in *; do [[ -f "$f" ]] && mv "$f" "unix_$f"; done

1

Z rnm (musisz go zainstalować):

rnm -ns 'Unix_/fn/' *

Lub

rnm -rs '/^/Unix_/' *

PS: Jestem autorem tego narzędzia.


2
Powinieneś przejrzeć wszystkie swoje odpowiedzi na temat swojego narzędzia i dodać zastrzeżenie, że jesteś jego autorem.
Mogsdad

@Mogsdad: Nie sądzę, żeby to była potrzebna informacja. Jeśli ktoś chce znaleźć autora, to całkiem proste.
Jahid

Dziękuję za to narzędzie. Z jakiegoś powodu renamenie działa dla mnie, ale rnmdziała.
Aloso

0

Sytuacja:

Mamy w certificate.key certificate.crtśrodku/user/ssl/

Chcemy zmienić nazwę wszystkiego, co zaczyna się od certificatedocertificate_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 ssdo:

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, certiw 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 cddo katalogu i zrób to tam. UŻYWAJ NA WŁASNE RYZYKO.


0

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_/' '{}' \;

-execdirnajpierw cds 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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.