Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: uphero в Nov 11, 2015, 23:18



Титла: Работа с голям брой архиви - отваряне и триене на файл.
Публикувано от: uphero в Nov 11, 2015, 23:18
Здравейте,
имам една чуденка дали под линукс няма да е възможно да отворя няколко архива (~20К) и от всеки да изтрия файл, който във всеки архив е със едно и също име?
Всякакви насоки и идеи са добре дошли, ако трябва специално заради това ще инсталирам дистрибуции, пакети и каквото е нужно.


Титла: Re: Работа с голям брой архиви - отваряне и триене на файл.
Публикувано от: pennywise в Nov 11, 2015, 23:29
Ако е zip, може да пробваш с:
Код:
zip -d archive.zip "picture.jpg" 

Това може да го вкараш в скрипт който да мине през всеки архив, директорията и/или субдиректориите.


Титла: Re: Работа с голям брой архиви - отваряне и триене на файл.
Публикувано от: neter в Nov 12, 2015, 03:41
Ако питаш за компресирани tarball-ове (tar.gz, tar.bz2...), не се поддържа изтриване на файл без предварително разкомпресиране. Например, ако имаш tar.gz архив, то първо изпълняваш команда:
Код:
gunzip архив.tar.gz

След това изтриваш файла с команда:
Код:
tar --delete -f архив.tar път/до/файла/име_на_файла

И накрая отново компресираш tarball-а с команда:
Код:
gzip архив.tar

Въпреки че са повечко стъпки, отново не пречи да го скриптираш. В твоя случай само трябва да попълниш имената на файловете в масив, след което да завъртиш нужните команди за твоя тип архив в цикъл, който да обходи всички елементи на масива. Пример:
Код
GeSHi (Bash):
  1. #!/bin/bash
  2.  
  3. files=(*.tar.gz)
  4.  
  5. for i in ${files[*]}; do
  6.    команди за изтриване на файл, като името на архива се заменя с $i
  7. done


Титла: Re: Работа с голям брой архиви - отваряне и триене на файл.
Публикувано от: uphero в Nov 12, 2015, 09:29
Да, пропуснал съм явно най-важноте.
ZIP И RAR са архивите, и сега ги прегледах и не във всеки архив е със едно и също име файла, но започва по един и същ начин.
И тоя код кой програмен език е да не ви досаждам с елементарни питания?
Ако може да ми дадете комнада за това, аз вече по примера ще си направя скрипта.

Също и това колко ще товари?
В смисъл как да структурирам всичко без проблем да може да обработи всички архиви - над 20 000 са.


Титла: Re: Работа с голям брой архиви - отваряне и триене на файл.
Публикувано от: Acho в Nov 12, 2015, 10:00
Това са bash команди. Изпълняваш си ги директно в конзолата.


Титла: Re: Работа с голям брой архиви - отваряне и триене на файл.
Публикувано от: neter в Nov 13, 2015, 10:58
Да, езикът в по-големия пример е bash, а в командите се използват инструменти за разархивиране. А като имената на файловете започват по един и същи начин, в папки с еднакви имена ли се намират в архивите, или и те се различават някак, и има ли на същите места файлове, имената на които започват по същия начин, но не трябва да се трият?


Титла: Re: Работа с голям брой архиви - отваряне и триене на файл.
Публикувано от: korea60 в Nov 13, 2015, 18:50
Със сигурност има по-добри решения и с доста повече проверки, но може да погледнеш това (работи с зип архиви).

#!/bin/bash


if [ $# -lt 1 ];then
   echo "Expected directory"
fi


for i in $(find $1 -type f -name "*.zip");do
   unzip -l $i | egrep "file1.*" >> /dev/null
   if [ $? -eq 0 ];then
      echo "$i" >> "LogFile.txt"
   fi
done


while read line;do
   zip -d $line "file1.*"
done<"LogFile.txt"


Титла: Re: Работа с голям брой архиви - отваряне и триене на файл.
Публикувано от: uphero в Nov 13, 2015, 20:49
Да, езикът в по-големия пример е bash, а в командите се използват инструменти за разархивиране. А като имената на файловете започват по един и същи начин, в папки с еднакви имена ли се намират в архивите, или и те се различават някак, и има ли на същите места файлове, имената на които започват по същия начин, но не трябва да се трият?
Не, няма папки.
В архива има 2 файла - единия започва с Readme... другия със различно име.
Този който започва с  Readme... трябва да се изтрие.


Титла: Re: Работа с голям брой архиви - отваряне и триене на файл.
Публикувано от: neter в Nov 16, 2015, 00:49
Код
GeSHi (Bash):
  1. #!/bin/bash
  2.  
  3. folder="/папка/с/архиви"
  4. delete="Readme*"
  5.  
  6. ls "$folder" | while read file; do
  7.    if [[ "${file##*.}" == "zip" ]]; then
  8.        zip -d "$folder/$file" "$delete" >/dev/null
  9.    elif [[ "${file##*.}" == "rar" ]]; then
  10.        rar d "$folder/$file" "$delete" >/dev/null
  11.    fi
  12. done

Преди това си инсталирай пакетите zip и rar, ако текущо не са ти инсталирани.