Linux - Zastępowanie spacji w nazwach plików

96

Mam kilka plików w folderze i chcę zastąpić każdy znak spacji we wszystkich nazwach plików podkreśleniami. Jak mogę to osiągnąć?

Mithun Sreedharan
źródło

Odpowiedzi:

172

To powinno wystarczyć:

for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done
neesh
źródło
To nie zadziałało dla mnie. Twierdził, że istnieją identyczne pliki (z niewłaściwymi nazwami plików). Np. Próbuję zmienić nazwę, 1 - foo.jpga mój folder już 1.jpgw niej był.
byxor
3
Uważam, że grawerunki są trudne do odczytania, gdy są blisko cudzysłowów. To samo, ale bardziej czytelne byłobyfor file in *; do mv "$file" $(echo $file | tr ' ' '_') ; done
Kamil S Jaron
Uwaga: to jest uruchamiane WEWNĄTRZ katalogu, którego nazwy plików chcesz zaktualizować. Alternatywnie możesz zmienić *na PATH_TO_YOUR_DIRECTORY.
CFitz
73

Wolę używać polecenia „rename”, które przyjmuje wyrażenia regularne w stylu Perla:

rename "s/ /_/g" *

Możesz wykonać próbny bieg z flagą -n:

rename -n "s/ /_/g" *
DF.
źródło
3
to zadziała, jeśli masz zmianę nazwy w stylu perla, a nie prostszą redhat / fedora
David Dean
9
wersja Fedory torename " " "_" *
David Dean
4
renameniedostępne w OSX.
Etienne Low-Décarie,
W systemie macOS 10.12.3 renamejest dostępny.
Śpiewano Cho
1
@DavidDean Zmiana nazwy w Arch Linux zastąpi tylko pierwsze wystąpienie (niezbyt wygodne dla plików / katalogów z wieloma spacjami). Ma tę samą składnię, co wersja fedora, więc podejrzewam, że może być taka sama. Ale można zainstalować perl-rename.
prosoitos
15

Użyj sh ...

for i in *' '*; do   mv "$i" `echo $i | sed -e 's/ /_/g'`; done

Jeśli chcesz to wypróbować przed naciśnięciem spustu, po prostu zmień mvna echo mv.

DigitalRoss
źródło
4

Jeśli używasz basha:

for file in *; do mv "$file" ${file// /_}; done
Murali VP
źródło
kiedy próbowałem, otrzymałem mv: podczas przenoszenia wielu plików ostatni argument musi być katalogiem Spróbuj mv --help' for more information. mv: when moving multiple files, last argument must be a directory Try mv --help ', aby uzyskać więcej informacji.
Mithun Sreedharan
Ponownie błąd mv: brak argumentu pliku Spróbuj mv --help' for more information. mv: missing file argument Try mv --help ', aby uzyskać więcej informacji. mv: missing file argument Spróbuj mv --help' for more information. mv: missing file argument Try mv --help ', aby uzyskać więcej informacji.
Mithun Sreedharan
@ levislevis85: Dzięki, nie wiedziałem tego.
soulmerge
4

A co jeśli chcesz zastosować zadanie zamiany rekurencyjnie ? Jak byś to zrobił?

Cóż, właśnie znalazłem odpowiedź. Nie jest to najbardziej eleganckie rozwiązanie (próbuje również zmienić nazwy plików, które nie spełniają warunku), ale działa. (BTW, w moim przypadku musiałem zmienić nazwy plików na „% 20”, a nie na podkreślenie)

#!/bin/bash
find . -type d | while read N
do
     (
           cd "$N"
           if test "$?" = "0"
           then
               for file in *; do mv "$file" ${file// /%20}; done
           fi
     )
done
javipas
źródło
2

Spróbuj czegoś takiego, zakładając, że wszystkie twoje pliki to .txt:

for files in *.txt; do mv “$files” `echo $files | tr ‘ ‘ ‘_’`; done
Amir Afghani
źródło
2
otrzymałem poniższy błąd tr: dwa ciągi muszą być podane podczas tłumaczenia mv: missing file argument Spróbuj `mv --help ', aby uzyskać więcej informacji.
Mithun Sreedharan
2
Błąd Agin tr: za dużo argumentów Spróbuj tr --help' for more information. mv: missing file argument Try mv --help ', aby uzyskać więcej informacji.
Mithun Sreedharan
2

Oto inne rozwiązanie:

ls | awk '{printf("\"%s\"\n", $0)}' | sed 'p; s/\ /_/g' | xargs -n2 mv
  1. używa awk do dodawania cudzysłowów wokół nazwy pliku
  2. używa seda do zastąpienia spacji podkreśleniami; wypisuje oryginalną nazwę w cudzysłowie (z awk); to nazwa podstawiona
  3. xargs pobiera 2 linie na raz i przekazuje je do mv
yoogottamk
źródło
1

Cytuj swoje zmienne:

for file in *; do echo mv "'$file'" "${file// /_}"; done

Usuń „echo”, aby dokonać faktycznej zmiany nazwy.

ghostdog74
źródło
Powtarza poprawnie polecenia mv, ale tak naprawdę nie zmienia nazwy pliku!
Mithun Sreedharan
usunięcie echa powoduje błąd taki jak mv: nie można stat \'1130 lake micigan view.jpg\'': No such file or directory mv: cannot stat \ '1130_1_bedroom_floor_plan.jpg \' ': Brak takiego pliku lub katalogu mv: nie można stat \'1130_BedPicture_8.jpg\'': No such file or directory mv: cannot stat \' 1130_diningroom_table.jpg \ '': Brak takiego pliku lub katalogu
Mithun Sreedharan
Linux Linux 2.6.9-42.0.3.EL.wh1smp # 1 SMP piątek 14 sierpnia 15:48:17 MDT 2009 i686 i686 i386 GNU / Linux
Mithun Sreedharan
1

Najłatwiejszym sposobem zastąpienia ciągu (w twoim przypadku znaku spacji) innym Linuxjest użycie sed. Możesz to zrobić w następujący sposób

sed -i 's/\s/_/g' *

Mam nadzieję że to pomoże.

Desta Haileselassie Hagos
źródło
To nie odpowiada na pytanie.
amit
0

Aby zmienić nazwy wszystkich plików z użyciem .pyrozszerzenia, find . -iname "*.py" -type f | xargs -I% rename "s/ /_/g" "%"

Przykładowe wyjście,

$ find . -iname "*.py" -type f                                                     
./Sample File.py
./Sample/Sample File.py
$ find . -iname "*.py" -type f | xargs -I% rename "s/ /_/g" "%"
$ find . -iname "*.py" -type f                                                     
./Sample/Sample_File.py
./Sample_File.py
akilesh raj
źródło