Odpowiedzi:
Alternatywne polecenie bez jawnej pętli ( man find
):
find . -type f -exec mv '{}' '{}'.jpg \;
Objaśnienie: to rekurencyjnie wyszukuje wszystkie pliki ( -type f
), zaczynając od bieżącego katalogu ( .
) i stosuje polecenie move ( mv
) do każdego z nich. Zwróć również uwagę na cudzysłowy {}
, aby nazwy plików ze spacjami (a nawet znakami nowej linii ...) były prawidłowo obsługiwane.
for
pętli denerwującej bash, aby iterować po liście plików, to nie jest poprawne. for
Pętla bash iteracyjnie wydaje każde mv
polecenie.
find
najpierw tworzy listę plików przed wykonaniem -exec
instrukcji? Chyba tak, ale chcę wyjaśnić ten punkt przed zakodowaniem nieskończonych pętli.
-not -name "*.*"
wystarczy.
to znajdzie pliki bez rozszerzenia i doda twój .jpg
find /path -type f -not -name "*.*" -exec mv "{}" "{}".jpg \;
Trochę za późno, ale pomyślałem, że dodam, że lepszym rozwiązaniem (choć może mniej czytelnym) od dotychczasowych mogłoby być:
find /path -type f -not -name "*.*" -print0 | xargs -0 rename 's/(.)$/$1.jpg/'
Użycie find | xargs
wzorca generalnie skutkuje bardziej wydajnym wykonaniem, ponieważ nie trzeba rozwidlać nowego procesu dla każdego pliku.
Zauważ, że wymaga to wersji zmiany nazwy, którą można znaleźć w dystrybucjach o smaku Debiana (zwanej również prename), a nie tradycyjnej zmiany nazwy. Jest to jednak tylko mały skrypt w Perlu, więc byłoby dość łatwo użyć powyższego polecenia w dowolnym systemie.
lubię to,
for f in $(find . -type f); do mv $f ${f}.jpg; done
Nie spodziewam się, że będziesz mieć nazwy plików oddzielone spacjami.
Jeśli to zrobisz, nazwy będą musiały zostać nieco przetworzone.
Jeśli chcesz, aby wykonać polecenie z jakiegoś innego katalogu,
można wymienić find .
z find /target/directory
.
-type
.
rename
nie jestem pewien, czy może zmienić nazwy plików bez rozszerzeń (jestem teraz w systemie Windows 7)
rename
, jeden program w C zawarty w util-linux-ng i jeden program w Perlu (autorstwa samego Wall'a) na komputerach Debiana naszego uniwersytetu. W rzeczywistości żaden z nich nie wykonuje rekursji.