Skip to content


Удаление файлов, расширения которых не входят в заданный список

Есть задача – удалять из заданных директорий все файлы кроме тех, "расширения" которых входят в заданный список:

  • .mp3
  • .mp3_env
  • .mp3_dig
  • .mp2_env
  • .mp2_dig
  • .wav
  • .wav_env
  • .wav_dig

Сразу приношу свои извинения эстетам, которые скажут, что в UNIX-like OS нет понятия "расширение имени файла", и что это чисто DOS-овская терминология. Я понимаю, просто так проще было выразить мысль :)

#!/bin/bash
 
PREFIX=/var/spool/samba
SUBJ="Deleted files from $PREFIX at `/bin/hostname -s`"
TMP=/var/tmp/`basename $0`.$$
EMAIL=admin@somehost.com
# Base list of allowed extensions
EXTs="mp3 mp2 wav"
REGEX=".*\.\("
 
for i in $EXTs; do
  REGEX="${REGEX}${i}\|"
  REGEX="${REGEX}${i}_env\|"
  REGEX="${REGEX}${i}_dig\|"
done
 
# Trailing "|" deleting
REGEX=${REGEX/%|/}
# Trailing "\" deleting
REGEX=${REGEX/%\\/}
# Closing regex
REGEX="${REGEX}\)$"
# В результате получили такой regex:
# ".*\.\(mp3\|mp3_env\|mp3_dig\|mp2\|mp2_env\|mp2_dig\|wav\|wav_env\|wav_dig\)$"
 
for DIR in ${PREFIX}/dir1 ${PREFIX}/dir2; do
  find $DIR -type f ! -iregex "${REGEX}" -print0 | \
    /usr/bin/xargs --null -r stat --printf="|%n|\n" >> $TMP
  find $DIR -type f ! -iregex "${REGEX}" -print0 | \
    /usr/bin/xargs --null -r rm
done
 
if [ `/bin/cat $TMP | /usr/bin/wc -l` -gt 0 ]; then
  /bin/cat $TMP | /bin/mail -s "$SUBJ" $EMAIL -- -f robot@someserver.com
fi
 
[ -f $TMP ] && rm $TMP

Posted in *nix.

Tagged with , , , .


4 Responses

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.

  1. гaгaш says

    Хорошая статья, да и сам сайт я смотрю очень даже не плох. Попал сюда по поиску из Google, занес в букмарки :)

  2. Вася says

    А зачем в команде mail два минуса?

  3. Сергей says

    В команде mail два минуса нужны чтобы было возможным указать обратный адрес с ключом -f. Без двух минусов почему-то не работает.

  4. Игорь says

    digiton файлы разметки )))

You must be logged in to post a comment.