LinuxForum.Fans
Тема

удалить строки из файла

Автор: FreeOwl 12 сообщений 4372 просмотров
#290540

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

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

PS Если кому-нибудь скучно(интересно), то на самом деле это кусочек из следующей задачи:
есть папка в которой более 12 тысяч файлов/каталогов, нужно пораскинуть файлы по месяцам в папки типа 01,02,03... но не трогать файлы которые в списке исключений (fileexcl.txt)
черновик выглядит так
text
#!/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

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

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

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

"FreeOwl" написал:
черновик выглядит так

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

#290545

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

#290547
Fat-Zer написал:

[quote="FreeOwl"]черновик выглядит так

вместо порева с датами лучше date использовать....[/quote]
как с помощью date вывести последнее число месяца $im?

#290619
"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 пропускать?
или у тебя всё так тяжело, что переводы строк в именах есть и это какой-то тёмный воркараунд?

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

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

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

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

#290652

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

text
#!/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...)

#290672

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

text

#!/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))

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

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

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

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

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

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

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

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

#290769

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

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

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

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


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

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

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

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

Войдите или зарегистрируйтесь, чтобы ответить.