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?


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

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/' *

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...

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

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/ *

6
find . | while read FILE; do if [ $(file --mime-type -b "$FILE") == "image/jpeg" ]; then mv "$FILE" "$FILE".jpg; fi; done;

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.


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

--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


-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;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.