Dodaj rozszerzenie pliku do plików za pomocą bash

94

Jaki jest dobry sposób dodawania rozszerzenia „.jpg” do plików bez rozszerzeń za pomocą bash?

Adrian
źródło
3
mv "${file}" "${file}.jpg"?
onteria_
2
Co to jest według Ciebie „plik bez rozszerzeń”? Czy to plik bez kropki w nazwie?
glenn jackman

Odpowiedzi:

118
for f in *.jpg; do mv "$f" "${f%.jpg}"; done
for f in *; do mv "$f" "$f.jpg"; done
Seth Robertson
źródło
8
druga jest idealna do zmiany nazw plików bez rozszerzeń! dzięki!
anon58192932
2
druga dodaje rozszerzenie do wszystkich plików, nie tylko tych bez rozszerzeń
Jeff
5
tak jak uwaga "${f%.jpg}"jest operacja na łańcuchach powłoki bash. `$ {string% substring}` Usuwa najkrótsze dopasowanie podciągu $ z tyłu łańcucha $.
Jichao
Ostrzeżenie: jeśli masz folder z mieszanymi rozszerzeniami, pamiętaj, że powyższe dotyczy .jpgnawet zwykłych plików.
sachinruk
61

Możesz użyć zmiany nazwy:

rename 's/(.*)/$1.jpg/' *
Kim Stebel
źródło
3
której wersji zmiany nazwy używasz? Mój ma różne argumenty:rename from to file...
B Johnson
1
funkcja rename jest zawarta w perlu w wersji 5.10.1.
Kim Stebel
3
Działa to świetnie ze zmianą nazwy zawartą w Ubuntu (i zgaduję, że wszystkie dystrybucje oparte na Debianie), znacznie mniej rozwlekłe niż odpowiedź jm666.
Roger Heathcote
28

Inny sposób - bez pętli

find . -type f -not -name "*.*" -print0 |\
xargs -0 file |\
grep  'JPEG image data' |\
sed 's/:.*//' |\
xargs -I % echo mv % %.jpg

Awaria:

  • znajdź wszystkie pliki bez rozszerzenia
  • sprawdź typ pliku
  • odfiltruj tylko pliki JPG
  • usuń informacje o typie pliku
  • xargs uruchamia "mv" dla każdego pliku

powyższa komenda służy do pracy na sucho , po niej należy usunąć "echo" przed mv

EDYCJA Niektórzy ludzie sugerują, że tutaj jest potrzebne "Zawijaj argumenty ścieżki w cudzysłów; unika podziału argumentów na ścieżkach ze spacjami" .

Zwykle to zalecenie jest prawdziwe, w tym przypadku nie. Ponieważ tutaj rozszerzenie %zostało zastąpione nie przez rozwinięcie powłoki, ale xargswewnętrznie (bezpośrednio), więc %zostanie poprawnie podstawione, nawet ze spacjami w nazwach plików.

Proste demo:

$ mkdir xargstest
$ cd xargstest

# create two files with spaces in names
$ touch 'a b' 'c d'

$ find . -type f -print
./c d
./a b
# notice, here are spaces in the above paths

#the actual xargs mv WITHOUT quotes
$ find . -type f -print | xargs -I % mv % %.ext

$ find . -type f -print
./a b.ext
./c d.ext
# the result is correct even in case with spaces in the filenames...
jm666
źródło
Możesz umieścić to w pętli, a te xargs są zbyteczne. W tej sytuacji bardziej podoba mi się odpowiedź Ryana.
Lucjusz
1
@Lucius - przy okazji, pytanie dotyczy plików "bez rozszerzeń" - więc Ryan powinien znaleźć tylko te ...
jm666
@ jm666 hej! jak zmodyfikować fragment kodu, aby zmienić nazwy wszystkich plików bez rozszerzeń w folderze na ich odpowiednie rozszerzenia. (
Wykrywam
24

Po prostu przejdź do katalogu, w którym znajdują się twoje pliki i:

for f in *;do mv $f $f.jpg;done
bharath
źródło
Z jakiegoś powodu to działa dla mnie, ale rozwiązanie Setha z cudzysłowami nie. (OSX Mountain Lion bash)
delrocco
4
Byłoby lepiej, gdyby zostało użyte for f in *;do mv "$f" "$f".jpg;donedo obsługi spacji w nazwach plików.
Hritik
Dzięki za to eleganckie i proste rozwiązanie - wielokrotnie trafiałem na tę odpowiedź, ale nie mogę jej zapamiętać. #dejavu
Tim Andersen
15

próba:

 rename -n s/$/.jpg/ *

faktyczna zmiana nazwy:

 rename s/$/.jpg/ *
Alexey
źródło
6
find . | while read FILE; do if [ $(file --mime-type -b "$FILE") == "image/jpeg" ]; then mv "$FILE" "$FILE".jpg; fi; done;
Ryan Li
źródło
1

W moim przypadku nie byłem świadomy typu pliku, więc użyłem polecenia mv z pomocą polecenia pliku, aby sprawdzić i prawdopodobnie znaleźć typ pliku. To rozwiązanie może nie być idealne dla wszystkich plików, ponieważ polecenie pliku może nie rozpoznawać typu pliku, ale działało w większości dobrze.

for f in *; do ext=$(file $f | awk '{print $2;}'); mv -n "$f" "$f.$ext"; done

Użycie awk polega na usunięciu drugiego słowa łańcucha zwróconego z pliku poleceń , który jest w rzeczywistości rozszerzeniem.

Paolo
źródło
automatycznie obsługuje pliki jpg i png. wykorzystałem i działa - wielkie dzięki! Dopiero teraz rozszerzeniami są CAPS. mały problem :)
krivar
0
rename --dry-run * -a ".jpg" # test  
* -a ".jpg" # rename
Roman Rhrn Nesterov
źródło
--dry-runi -anie są dostępne w mojej wersji rename. Jeśli jest to specyficzne dla jakiejś architektury, należy to określić.
Fernando César
0

Możesz użyć przenoszenia wielu plików . Jestem opiekunem tego projektu. Składnia jest prosta.

mmf files*

Otworzy twój $ EDITOR ze wszystkimi nazwami plików lub domyślnie vim i możesz po prostu podświetlić koniec wszystkich nazw plików używając Ctrl + v + G w vimie, zapisać plik, wyjść i to, wszystkie twoje pliki są przemianowane

Almas Abdrazak
źródło
-2

Ryan Li

Prawidłowa składnia dodawania rozszerzenia pliku do wielu plików w katalogu, które nie mają rozszerzenia, to

find . | while read FILE; do if [[ -n `file --mime-type "$FILE" | grep 'message/rfc822'` ]]; then  mv "$FILE" "$FILE".eml; fi; done;
Dillon Beresford
źródło