Chcę rekurencyjnie przechodzić przez katalog i zmieniać rozszerzenia wszystkich plików o określonym rozszerzeniu, powiedzmy .t1na .t2. Jakie polecenie bash służy do tego?
@AmalAntony: Jeśli nie masz rename, napisz skrypt powłoki, który zmienia nazwę pojedynczego pliku (jest to trywialne w twoim prostym przypadku), a następnie użyj findtego skryptu, aby zastosować ten skrypt do wszystkich plików z naruszającym rozszerzeniem.
(Moja wersja renamenie pozwala na wyrażenie podstawienia w stylu seda. Uwielbiam Linuksa. Kiedyś musiałem instalować TotalCommander dla Windows, aby robić takie rzeczy.)
Aaron Blenkush
6
Na wypadek, gdyby ktoś się zastanawiał, co "${1%.t1}".t2robi ta część, tak jak ja: Używa operacji na łańcuchach basha, aby wykonać następujące czynności: 1 / Weź pierwszy parametr pozycyjny $1i obetnij .t1literał ciągu od jego końca ( %operator znaku procentu ). 2 / Dołącz .t2literał ciągu do wyniku.
Zack,
2
Zmiana nazwy nie zadziałała dla mnie w OSX, ale wersja bash jest niesamowita b / c Właśnie dodałem
``
3
wolą użytkowników find . -type f -name '*.t1'unikać folderów
Golak Sarangi
9
Jeśli Twoja wersja bashobsługuje tę globstaropcję (wersja 4 lub nowsza):
shopt -s globstar
for f in **/*.t1; do
mv "$f""${f%.t1}.t2"done
rename
, napisz skrypt powłoki, który zmienia nazwę pojedynczego pliku (jest to trywialne w twoim prostym przypadku), a następnie użyjfind
tego skryptu, aby zastosować ten skrypt do wszystkich plików z naruszającym rozszerzeniem.Odpowiedzi:
Jeśli masz możliwość zmiany nazwy, użyj:
find . -name "*.t1" -exec rename 's/\.t1$/.t2/' '{}' +
albo:
find . -name '*.t1' -exec rename .t1 .t2 {} +
Jeśli zmiana nazwy nie jest dostępna, użyj:
find . -name "*.t1" -exec bash -c 'mv "$1" "${1%.t1}".t2' - '{}' +
źródło
find . -name '*.t1' -exec rename .t1 .t2 {} +
rename
nie pozwala na wyrażenie podstawienia w stylu seda. Uwielbiam Linuksa. Kiedyś musiałem instalować TotalCommander dla Windows, aby robić takie rzeczy.)"${1%.t1}".t2
robi ta część, tak jak ja: Używa operacji na łańcuchach basha, aby wykonać następujące czynności: 1 / Weź pierwszy parametr pozycyjny$1
i obetnij.t1
literał ciągu od jego końca (%
operator znaku procentu ). 2 / Dołącz.t2
literał ciągu do wyniku.find . -type f -name '*.t1'
unikać folderówJeśli Twoja wersja
bash
obsługuje tęglobstar
opcję (wersja 4 lub nowsza):shopt -s globstar for f in **/*.t1; do mv "$f" "${f%.t1}.t2" done
źródło
Lub możesz po prostu zainstalować
mmv
polecenie i wykonać:mmv '*.t1' '#1.t2'
Oto
#1
pierwsza część globu, czyli*
in*.t1
.Lub w czystym bashu, prostym sposobem byłoby:
for f in *.t1; do mv "$f" "${f%.t1}.t2" done
(tj .:
for
może wyświetlać pliki bez pomocy zewnętrznego polecenia, takiego jakls
lubfind
)HTH
źródło
*
*.t1
Zrobiłbym tak w bash:
for i in $(ls *.t1); do mv "$i" "${i%.t1}.t2" done
EDYCJA: mój błąd: to nie jest rekurencyjne, oto mój sposób na rekurencyjną zmianę nazwy pliku:
for i in $(find `pwd` -name "*.t1"); do mv "$i" "${i%.t1}.t2" done
źródło
find
składnia jest zła. Upewnij się również, że cytowałeś swoje zmienne