2009-09-30 10 views

Odpowiedz

30

Spróbuj tego (to działa w zwykły stary Bourne sh również):

for i in *000.tga 
do 
    mv "$i" "`echo $i | sed 's/000//'`" 
done 

Oba argumenty są zapakowane w cudzysłowie wspierających spacji nazwy plików.

+0

+1 dla większości przenośnych rozwiązań (i dlatego, że mam zbyt mało akcji na przegranych, aby utrzymać dobre odpowiedzi na wszystkie pytania). –

33

atakujących może zrobić sed -jak podstawienia:

for file in *; do mv "${file}" "${file/000/}"; done 
+0

ładnie działa na OS X (10.6.8). Poręczny i zwięzły. Dzięki. – jamesnotjim

+0

Dobrze, czy możesz wyjaśnić funkcję "{"? – efrem

+0

@efrem: nawiasy klamrowe są opcjonalnym ogranicznikiem nazw zmiennych i są niezbędne dla rozszerzeń parametrów. Aby uzyskać więcej informacji, zobacz [Bash Manual] (https://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion). –

8

Rozwiązanie non-bash, ponieważ wiem, że dwa szybkich plakaty zostały już pokryte że:

Jest doskonały program krótki Perl nazywany rename który jest domyślnie instalowany w niektórych systemach (inni mają mniej przydatny program zmiany nazwy) . To pozwala używać perl regex do zmiany nazwy, na przykład:

rename 's/000//' *000*.tga 
4
#!/bin/bash 
ls | while read name; do 
    echo mv $name ${name/$1//} 
done 
+1

+1: Uwielbiam '| podczas czytania "skonstruuj". – Cascabel

+3

W jaki sposób "ls | while read name" jest lepsze niż "nazwa w *"? –

+0

@ Laurence Gonsalves: użycie symboli wieloznacznych powłoki rozszerza linię poleceń, a tam jest nie tak duży limit. "while read" pozwala uniknąć – Javier

Powiązane problemy