LINUX.ORG.RU

Найти файлы с расширением и удалить расширение из названия

 , , , ,


0

1

Подсунули мне тут завирусованный комп с виндой на борту, где «вирус» подобавлял расширения ".blahblah" к имени файла.

find . -name ".blahblah"

файлы успешно находит. Что подсунуть в команду, чтоб условный «*.jpeg.blahblah» превратился в «*.jpeg»?

★★★
kir@localhost ~/test/test_to_rm $ ls
photo.jpg  photo.jpg.blahblah
kir@localhost ~/test/test_to_rm $ find . -name ".blahblah"
kir@localhost ~/test/test_to_rm $ find . -name "*.blahblah"
./photo.jpg.blahblah
kir@localhost ~/test/test_to_rm $ find . -name "*.blahblah"|sed -e 's/\.blahblah//'
./photo.jpg
kir@localhost ~/test/test_to_rm $ ls
photo.jpg  photo.jpg.blahblah
kir@localhost ~/test/test_to_rm $ for i in `find . -name "*.blahblah"`; do mv $i $(ls $i|sed -e 's/\.blahblah//'); done
kir@localhost ~/test/test_to_rm $ ls
photo.jpg
kir@localhost ~/test/test_to_rm $
kir64 ★★
()
Ответ на: комментарий от reprimand

надо же, меня опередили! :) да еще и с рабочим примером

reprimand ★★★★★
()
Ответ на: комментарий от dvrts

Раз важные, сначала замени в моём варианте mv на cp, потом если всё ок - прогонишь rm по маске, как и проповедует anonymous выше.

kir64 ★★
()
#!/bin/bash

if [ $# == 0 ]; then
  find . -name '*.blahblah' -exec $0 {} \;
else
  echo mv "$1" "${1%.blahblah}"
fi
anonymous
()
Ответ на: комментарий от anonymous

ORLY?

kir@localhost ~/test/test_to_rm $ ls
photo.jpg  photo.jpg.blahblah  photo.jpg.blahblah.somethingelse
kir@localhost ~/test/test_to_rm $ find . -name "*.blahblah"
./photo.jpg.blahblah
kir@localhost ~/test/test_to_rm $ find . -name "*.blahblah*"
./photo.jpg.blahblah.somethingelse
./photo.jpg.blahblah
kir@localhost ~/test/test_to_rm $ for i in `find . -name "*.blahblah"`; do mv $i $(ls $i|sed -e 's/\.blahblah//'); done
kir@localhost ~/test/test_to_rm $ ls
photo.jpg  photo.jpg.blahblah.somethingelse
kir@localhost ~/test/test_to_rm $
kir64 ★★
()
Ответ на: комментарий от kir64

да ты просто не поверишь, но:

$ touch "qwe.blahblah.asd.blahblah"
$ find . -name "*.blahblah" | sed -e 's/\.blahblah//'
./qwe.asd.blahblah

anonymous
()
Ответ на: комментарий от kir64

Все хорошо, но во многих директориях высыпает ошибки вида:

ls: cannot access Files/K-Lite: No such file or directory
cp: missing destination file operand after ‘Files/K-Lite’
Try 'cp --help' for more information.

С mv аналогично.

dvrts ★★★
() автор топика
Ответ на: комментарий от anonymous

Ох ты ж, об этом я не подумал, ты прав. Надеюсь, если ТС уже запустил однострочник, ему не попадется такая ситуация.

kir64 ★★
()
Ответ на: комментарий от dvrts

эту часть:

mv $i $(ls $i|sed -e 's/\.blahblah//')
поменяй на эту:
echo mv "$i" "${i%\.blahblah}"
потом убери echo

anonymous
()
Ответ на: комментарий от dvrts
 find . -name "*.blahblah" | while read file ; do mv "${file}" "${file%\.blahblah}" ; done

На что ругается-то хоть?

YAR ★★★★★
()
Ответ на: комментарий от dvrts

UPD: //slowpoke, выше уже ответили верно

Вот так:

kir@localhost ~/test/test_to_rm $ ls
file with spaces in filename.jpg  file with spaces in filename.jpg.blahblah

kir@localhost ~/test/test_to_rm $ ls -l
итого 0
-rw-r--r-- 1 kir kir 0 фев  1 21:44 file with spaces in filename.jpg
-rw-r--r-- 1 kir kir 0 фев  1 22:20 file with spaces in filename.jpg.blahblah

kir@localhost ~/test/test_to_rm $ find . -type f -name '*.blahblah' | while read file; do mv "$file" "${file%.blahblah}"; done

kir@localhost ~/test/test_to_rm $ ls -l
итого 0
-rw-r--r-- 1 kir kir 0 фев  1 22:20 file with spaces in filename.jpg

kir@localhost ~/test/test_to_rm $
kir64 ★★
()
Последнее исправление: kir64 (всего исправлений: 1)
Ответ на: комментарий от Eddy_Em

Тогда что ты делаешь в этой теме?

dvrts ★★★
() автор топика
Ответ на: комментарий от Eddy_Em

Зато теперь я тоже знаю, почему выхлоп ls не нужно использовать :)

kir64 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.