LinuxForum.Fans
Тема

Простенький скрипт: переименование файлов

Автор: shellon 22 сообщений 11490 просмотров
#167183

Имеем несколько папок в которых находится n-количество файлов.
Не более 3х в одной папке с расширениями *.001 *.002 *.003.

При запуске скрипт должен переименовывать/добавлять расширение .tif всем файлам в этих папках, но не трогать
те, которые ранее были переименованы так же на *.tif

Заранее имена папок и файлов неизвестны, т.к. они создаются при приеме факса и имя состоит из даты и времени.
Известно только то, что файлы, в зависимости от их количества в одной папке, с расширениями *.001 *.002 *.003.

Скрипт запускает факсовая программа после приема факса.
Заранее благодарен.

#167212
text
for File in `find <каталог>`; do
  if [ "`echo ${File} | grep .tif`" = "" ]; then
    mv ${File} ${File}.tif;
  fi;
done;

Я бы так написал. Правда, тут скрипт может обработать даже ситуацию типа "111.tif.001".

#167531

Правда, тут скрипт может обработать даже ситуацию типа "111.tif.001".

Поэтому надо взять расширение так:
[console] ${File##*.}[/console]

И вот
[console]
#! /bin/bash

for File in `find /home/mogul82/temp/222/ -type f` ; do

if [ ${File##*.} != 'tif' ]; then # проверяем расширение
mv ${File} ${File}.tif; # переименовавыем
fi

done
[/console]

Заменяем путь и не кладем в эту же папку, Заменит все файлы во всех подпапках, кроме имеющих уже tif

#175393
mogul82 написал:

Поэтому надо взять расширение так:
[console] ${File##*.}[/console]

А можно разъяснить этот момент? Как эти расширения задавать? Вот мне, например, надо переименовать файлы *.tif.lor в *.lor. Как с двумя точками расширение получить?

#176117
NordWest написал:

Вот мне, например, надо переименовать файлы *.tif.lor в *.lor. Как с двумя точками расширение получить?

#!/bin/bash
for file in `find ./ -name "*.tif.lor" -print`
do
mv $file `echo $file | sed -e 's/.tif.lor$/.lor/'`
done

#227322

доброго времени суток ребята!
у меня почти аналогичная ситуация! есть ftp сервер на который можно попасть и с http, мне нужен скрипт который будет искать файлы только по каталогам ftp с расширением php, http и cgi. и при нахождении их удалять.
Заранее спасибо!

#227329
Lupo Alberto написал:
Не совсем понял выражение «по каталогам ftp», но примерно так
text

find /ftp -name '*.php' -o -name '*.cgi' -o -name '*.http' -exec rm {} \;

здесь /ftp каталог, где будет производиться поиск.

«по каталогам ftp» в папке ftp есть и вложенные папки кторые тоже надо сканировать на наличие этих файлов!
я щас попробую.
как я понял создаю файл с таким содержанием и ставлю ее в cron

#227337
maga написал:
как я понял создаю файл с таким содержанием и ставлю ее в cron

Вы сначала проверьте, те ли файлы она ищет.

text
find /ftp -name '*.php' -o -name '*.cgi' -o -name '*.http' -ls
#227342

Вот так правильнее:
Посмотреть

text
find /ftp \( -name "*.php" -o -name "*.http" -o -name "*.cgi" \) -ls 

...и удалить

text
 find /ftp \( -name "*.php" -o -name "*.http" -o -name "*.cgi" \) -exec rm {} \;
#227347
Lupo Alberto написал:
Вот так правильнее:
Посмотреть
text
find /ftp \( -name "*.php" -o -name "*.http" -o -name "*.cgi" \) -ls 

...и удалить

text
 find /ftp \( -name "*.php" -o -name "*.http" -o -name "*.cgi" \) -exec rm {} \;

Lupo - такие вещи надо в http://linuxforum.ru/viewtopic.php?id=19703

#227349
newzenon написал:
Lupo - такие вещи надо в Sysadmins tips and tricks

Мне больше нравится это:

Чтобы найти, а при желании и удалить, символические ссылки, указывающие на отсутствующий файл, можно применять команду find.

Найти в каталоге /home/share/media «битые» символические ссылки:
text
 find -L /home/share/media -type l

Удалить их:

text
find -L /home/share/media -type l -exec {} \;

#229196
Lupo Alberto написал:
Вот так правильнее:
Посмотреть
find /ftp \( -name "*.php" -o -name "*.http" -o -name "*.cgi" \) -ls
...и удалить
find /ftp \( -name "*.php" -o -name "*.http" -o -name "*.cgi" \) -exec rm {} \;

ну ещё более правильно осилить ключ -delete или хотя-бы -depth.

#229202
drBatty написал:
ну ещё более правильно осилить ключ -delete или хотя-бы -depth.

А как в данной конструкции можно применить -depth и, главное, зачем?

#229331
Lupo Alberto написал:
А как в данной конструкции можно применить -depth и, главное, зачем?

-depth всегда следует применять при удалении файлов. Потому-что рано или поздно вам захочется удалять и каталоги. Впрочем, ваша строчка и так их будет удалять, ведь вы об этом не думали. :(

Хорошая новость - при -delete опция -depth включается автоматически.

#229336
drBatty написал:
Впрочем, ваша строчка и так их будет удалять, ведь вы об этом не думали. sad

Ну да, если только в имени каталога есть «.php» или «.html».

#229345
Lupo Alberto написал:
Ну да, если только в имени каталога есть «.php» или «.html».

всегда умиляли кодеры, которые переделывают ТЗ так, как им нравится - "это не баг, а фича! мой скрипт удаляет каталоги типа 1.php!" smile
Кстати не удаляет. Во первых потому-что rm не умеет каталоги, во вторых потому-что каталог в общем случае не пуст. А удалить непустой каталог невозможно.

#321313

Подскажите пожалуйста, как можно переименовывать файлы по маске если в имени файла встречаются символы вроде "%#&;'
Например в директории все файлы *.mp3;" в файлы *.mp3

#321316
"stalker_tk⇓" написал:
символы вроде "%#&;'

и что много таких файлов?

#321321

Если они откуда-нибудь из вконтактика, то вполне могут быть нечитаемые имена файлов. Как сделать, я сейчас не смогу подсказать , надо скилл повышать :) Знаю только, что спецсимволы нужно экранировать... Можно изобразить кучу шаблонов и искать, например, так:

text
find . -name "*\*"

но я вовсе не уверен, что это правильно...

#321323

"i2ks⇓" написал:
и что много таких файлов?
много, вручную переименовывать геморрой
"yars⇓" написал:
спецсимволы нужно экранировать...
попадалась статья на хабре про удаление, попробую изменить под мой случай
Войдите или зарегистрируйтесь, чтобы ответить.