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}\)$"
# echo "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

Похожие заметки:

  1. Список жизненно необходимых бизнес-семинаров
  2. hobocopy – копирование файлов, которые используются в данный момент
  3. История команд в bash с указанием даты и времени

Размещено в категории  *nix. Теги: , , , .

Комментариев: 1

Чтобы быть всегда в курсе здесь происходящего, Вы можете подписаться на RSS feed для комментариев на эту заметку.

  1. гaгaш said

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

Some HTML is OK

(required)

(required, but never shared)

, или ответить через trackback.