1 (14.12.2012 16:18:54 отредактировано FreeOwl)

есть два файла
1. Листинг каталога (filelist.txt)
2. Список исключений (fileexcl.txt)

нужно удалить из filelist.txt, строки которые записаны в fileexcl.txt.


+ PS Если кому-нибудь скучно(интересно), то на самом деле это кусочек из следующей задачи:

есть папка в которой более 12 тысяч файлов/каталогов, нужно пораскинуть файлы по месяцам в папки типа 01,02,03... но не трогать файлы которые в списке исключений  (fileexcl.txt)
черновик выглядит так

#!/bin/bash
# в качестве параметра указывается целевой каталог
#перебираем месяцы
for im in {01..12}; do

# определяем последний день месяца 28(29) или 30 или 31
        case "$im" in
        "02"                    ) #февраль
                datayang=2012"$im"292359;;
        "04"|"06"|"09"|"11"     ) # 30 последнее число
                datayang=2012"$im"302359;;
        *                       ) # у остальных 31 послднее число
                datayang=2012"$im"312359;;
        esac

# первое число месяца
        dataold=2012"$im"010001

# ---------контрольный вывод------------------
echo 'Шаг '$im
echo 'Файлы между: '$dataold' - '$datayang
#---------------------------------------------

# создаём файлы-эталоны даты
        touch $1\/told -t $dataold
        touch $1\/tyang -t $datayang

# ---------контрольный вывод------------------
#ls -l $1\/told
#ls -l $1\/tyang
#---------------------------------------------


# ищем файлы дата создание/модификаци которых находится между эталонами
        find $1 -maxdepth 1 \( -newer $1\/told -a -not -newer $1\/tyang \) | xargs -0 > list$im.txt

#       echo $1-$im
# ---------контрольный вывод------------------
#ls -l list$im.txt
#---------------------------------------------

done

идеи и конструктивная критика приветствуются

тыжпрограммист?

2

FreeOwl пишет:

есть два файла1. Листинг каталога (filelist.txt)2. Список исключений (fileexcl.txt)нужно удалить из filelist.txt, строки которые записаны в fileexcl.txt.

man grep, внимание на ключи -f и -v

FreeOwl пишет:

черновик выглядит так

вместо порева с датами лучше date использовать....

95% процентов проблем находятся между клавиатурой и стулом.

3

Решение:
grep -vf fileexcl.txt filelist.txt | xargs -0 >  filelist.txt - удалит
sed -e :a -e '/^\n*$/{$d;N;ba' -e '}' filelist.txt - удалит пустые строки в конце

тыжпрограммист?

4

Fat-Zer пишет:
FreeOwl пишет:

черновик выглядит так

вместо порева с датами лучше date использовать....

как с помощью date вывести последнее число месяца $im?

тыжпрограммист?

5

FreeOwl пишет:

как с помощью date вывести последнее число месяца $im?

проще использовать следующий месяц: date --date="2012-12-01 next month"
но если очень хочется, то можно и: date --date="2012-12-01 next month second ago"
ну и формат не забудь свой задать....

FreeOwl пишет:

grep -vf fileexcl.txt filelist.txt | xargs -0 >  filelist.txt - удалит

на кой это через xargs пропускать?
или у тебя всё так тяжело, что переводы строк в именах есть и это какой-то тёмный воркараунд?

95% процентов проблем находятся между клавиатурой и стулом.

6

Fat-Zer пишет:

на кой это через xargs пропускать?
или у тебя всё так тяжело, что переводы строк в именах есть и это какой-то тёмный воркараунд?

Чтоб никто не догадался ag

FreeOwl пишет:

есть папка в которой более 12 тысяч файлов/каталогов, нужно пораскинуть файлы по месяцам в папки типа 01,02,03... но не трогать файлы которые в списке исключений  (fileexcl.txt)

А точнее? Нужно раскинуть файлы из текущей директории? По какому принципу какой файл в какую директорию?

Да, у меня Ubuntu.
Нет, не глючит.

7 (14.12.2012 23:16:13 отредактировано FreeOwl)

Fat-Zer, спасибо. Сейчас черновик выглядит так:

#!/bin/bash

#перебираем месяцы
for im in {01..12}; do

        dataold=`date --date="2012-$im-01" +%Y%m%d%H%M`
        datayang=`date --date="2012-$im-01 next month second ago" +%Y%m%d%H%M`

# ---------контрольный вывод------------------
echo 'Шаг '$im
echo 'Файлы между: '$dataold' - '$datayang
#---------------------------------------------

# создаём файлы-эталоны даты
 touch $1\/told -t $dataold
 touch $1\/tyang -t $datayang

# ---------контрольный вывод------------------
#ls -l $1\/told
#ls -l $1\/tyang
#---------------------------------------------


# ищем файлы дата создание/модификаци которых находится между эталонами
        find $1 -maxdepth 1 \( -newer $1\/told -a -not -newer $1\/tyang \) > list$im.txt

# убираем из списка исключения
grep -vf exclude.txt list"$im".txt > list"$im"_.txt

# ---------контрольный вывод------------------
ls -l list"$im".txt
#---------------------------------------------

done

... (продолжение следует... mkdir mv...)

тыжпрограммист?

8 (15.12.2012 00:55:25 отредактировано -=Serj=-)

Если я правильно понял задачу:

#!/usr/bin/env python
#_*_ coding: utf-8 _*_

import os
import time
from stat import *

for fname in os.listdir('.'):
    if (fname[0]!='.' and not S_ISDIR(os.stat(fname).st_mode)):
        created_month = str(time.localtime(os.stat(fname).st_mtime).tm_mon)
        month_dir = os.path.join(os.path.abspath('.'), created_month)
        if not os.path.exists(month_dir):
            os.mkdir(month_dir)
        os.rename(os.path.abspath(fname), os.path.join(month_dir, fname))

Скрипт перебирает файлы в текущей директории, и если это не каталог и не скрытый файл, то перемещает его в каталог с месяцем изменения файла.

Да, у меня Ubuntu.
Нет, не глючит.

9

-=Serj=- пишет:

Если я правильно понял задачу:
Скрипт перебирает файлы в текущей директории, и если это не каталог и не скрытый файл, то перемещает его в каталог с месяцем изменения файла.

практически правильно понял, кроме двух моментов
1. и каталоги тоже
2. основная цель: изучение программирования bash на практике ab

тыжпрограммист?

10 (15.12.2012 23:18:42 отредактировано moshell)

FreeOwl пишет:

основная цель: изучение программирования bash на практике ab

немного философского флуда.

пришел я однажды в компанию одну.. по специфике работы нужно было конфигурить и конфигурить объекты..
научили делать это в графике( не знаю, умышленно ли, или ради прикола) удаленный рабочий стол через citrix,
и я спаривался с этим глючным цитриксом постоянно, ибо отклик отдач очень долгий, и невозможно одним "кликом" проверить разницу в нескольких объектах.
задался вопросом. позатрахивал коллег. оказалось что есть для этих целей moshell
неделя изучения moshell'a дала свои плоды. оказалось что все так просто и быстро.

и теперь, когда приходят новички и просят что нибудь показать в графике, я просто не знаю что им ответить.
показываю аналогию графических действий в консоли. мало того,  в графике нет возможности использовать скрипты.
юзаю баш, и поверьте мне, 10%-ного знания sed + grep + awk дают очень весомый результат.( а если выучить на все 100?) либо вы в графике будете делать это неделю. либо в bash за секунду(зависит от задач).

чот я не туда ушел.
в общем мораль сей басни такова. не поленитесь, потратьте неделю (а более башу не надо), и вам будет огромное счастье.!
и чем больше вам будут ставить задач, тем более вы продвинитесь в знаниях. проверено

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

11

обращение к фат-зер

откуда тебе знать что проще а что нет?
на то он и cli, и каждый решает для себя сам, что ему проще, а что нет.

или перед каждым вариантом будем "> time" вставлять?

другой вопрос когда идет вопрос о рациональности, эффективно или нет.


а что проще или не проще это уже философия ;-)

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

12

moshell пишет:

откуда тебе знать что проще а что нет?на то он и cli, и каждый решает для себя сам, что ему проще, а что нет.или перед каждым вариантом будем "> time" вставлять?другой вопрос когда идет вопрос о рациональности, эффективно или нет.

вот только к словам придираться не надо...
просто по логике рассуждений ТС  выбрал боле сложный путь: найти первое число следующего месяца алгоритмически проще, чем рассчитывать последнее число месяца. Тут конечно конечно вопрос, к какому месяцу отнести нулевую секунду, но тут оно ИМХО не особо важно...

кстати, в текущем варианте есть ошибка: файл созданный 31-го числа в 23:59:01-00:00:00 никуда не отнесётся.
и touch с ключом -d использует тот же формат, что и date, так что можно напрямую ему эту строку скармливать без посредников...

95% процентов проблем находятся между клавиатурой и стулом.