Próbuję zmienić nazwę plików w ten sposób:
for file in *;
do
mv -i "$file" "$(echo "$file" | sed -e 's/[^A-Za-z0-9._-]/_/g')";
done
Ale sed
polecenie zastępuje wszystkie spacje _
.
Jak mogę edytować sed
polecenie, aby zawierało spacje wraz z określonymi znakami? Próbowałem używać, \s
ale to nie działa ...
EDYCJA:
Na przykład: trip: hill
nazwa pliku powinna zostać zmieniona:, trip_ hill
ale powoduje to powyższe polecenie trip__hill
.
command-line
bash
sed
batch-rename
Zanna
źródło
źródło
Odpowiedzi:
Nie parsuj nazw plików za pomocą
sed
! Dane wyjścioweecho "$file"
mogą nie być wiarygodne.Zastosowanie
rename
. 17.10 musisz go najpierw zainstalowaćNastępnie:
Notatki
-n
po przetestowaniu, aby faktycznie zmienić nazwę plików--
koniec opcji w przypadku, gdy dowolny plik zaczyna się od-
[^-A-Za-z0-9_ .]
znaki, których nie chcemy zastępować - umieść na-
początku lub na końcu, aby nie wskazywały zakresu (jest traktowane dosłownie w tych pozycjach)..
jest traktowany dosłownie (w innych kontekstach wyrażeń regularnych oznacza każdą postać i musi być poprzedzony znakiem ucieczki).Działa to również w
sed
:Jeśli dodam spację na końcu w twojej wersji, pojawia się błąd:
Ale
-
na końcu działa:Być może więc pozycja łącznika spowodowała problem podczas dodawania spacji. Ale rada, aby nie analizować nazw plików, stoi!
źródło
.
jest to dosłowne w klasie postaci. TIL!Możesz także po prostu użyć powłoki, rozszerzenie parametrów Bash może zastąpić:
Podwójny ukośnik nakazuje zastąpienie wszystkich dopasowań poza tym, że składnia jest prosta.
źródło