Jaki jest dobry sposób dodawania rozszerzenia „.jpg” do plików bez rozszerzeń za pomocą bash?
Jaki jest dobry sposób dodawania rozszerzenia „.jpg” do plików bez rozszerzeń za pomocą bash?
Odpowiedzi:
for f in *.jpg; do mv "$f" "${f%.jpg}"; done
for f in *; do mv "$f" "$f.jpg"; done
"${f%.jpg}"
jest operacja na łańcuchach powłoki bash. `$ {string% substring}` Usuwa najkrótsze dopasowanie podciągu $ z tyłu łańcucha $.
.jpg
nawet zwykłych plików.
Możesz użyć zmiany nazwy:
rename 's/(.*)/$1.jpg/' *
rename from to file...
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:
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 xargs
wewnę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...
Po prostu przejdź do katalogu, w którym znajdują się twoje pliki i:
for f in *;do mv $f $f.jpg;done
for f in *;do mv "$f" "$f".jpg;done
do obsługi spacji w nazwach plików.
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.
rename --dry-run * -a ".jpg" # test
* -a ".jpg" # rename
--dry-run
i -a
nie są dostępne w mojej wersji rename
. Jeśli jest to specyficzne dla jakiejś architektury, należy to określić.
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
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;
mv "${file}" "${file}.jpg"
?