Автор Тема: Работа с голям брой архиви - отваряне и триене на файл.  (Прочетена 3196 пъти)

uphero

  • Напреднали
  • *****
  • Публикации: 117
  • Distribution: Elementary OS
    • Профил
    • WWW
Здравейте,
имам една чуденка дали под линукс няма да е възможно да отворя няколко архива (~20К) и от всеки да изтрия файл, който във всеки архив е със едно и също име?
Всякакви насоки и идеи са добре дошли, ако трябва специално заради това ще инсталирам дистрибуции, пакети и каквото е нужно.
Активен

Тук съм за да се уча,не се чудете на тъпите ми въпроси :)

pennywise

  • Гост
Ако е zip, може да пробваш с:
Код:
zip -d archive.zip "picture.jpg"

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

neter

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 3408
  • Distribution: Debian, SailfishOS, CentOS
  • Window Manager: LXDE, Lipstick
    • Профил
    • WWW
Ако питаш за компресирани 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
Активен

"Да си добре приспособен към болно общество не е признак за добро здраве" - Джиду Кришнамурти

uphero

  • Напреднали
  • *****
  • Публикации: 117
  • Distribution: Elementary OS
    • Профил
    • WWW
Да, пропуснал съм явно най-важноте.
ZIP И RAR са архивите, и сега ги прегледах и не във всеки архив е със едно и също име файла, но започва по един и същ начин.
И тоя код кой програмен език е да не ви досаждам с елементарни питания?
Ако може да ми дадете комнада за това, аз вече по примера ще си направя скрипта.

Също и това колко ще товари?
В смисъл как да структурирам всичко без проблем да може да обработи всички архиви - над 20 000 са.
« Последна редакция: Nov 12, 2015, 10:19 от uphero »
Активен

Тук съм за да се уча,не се чудете на тъпите ми въпроси :)

Acho

  • Напреднали
  • *****
  • Публикации: 5280
  • Distribution: Slackware, MikroTik - сървърно
  • Window Manager: console only
    • Профил
    • WWW
Това са bash команди. Изпълняваш си ги директно в конзолата.
Активен

CPU - Intel Quad-Core Q8400, 2.66 GHz; Fan - Intel Box; MB - Intel G41M-T2; RAM - DDR2-800, Kingston HyperX, 2X2048 MB; VC - onboard, Intel G41 Express Chipset; HDD - Toshiba, 500 GB, SATAII; SB - Realtek HD Audio; DVD-RW - TSSTcorp DVD-RW; LAN - Realtek PCI-E GBE Controller; PSU - Fortron 350 Watt.

neter

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 3408
  • Distribution: Debian, SailfishOS, CentOS
  • Window Manager: LXDE, Lipstick
    • Профил
    • WWW
Да, езикът в по-големия пример е bash, а в командите се използват инструменти за разархивиране. А като имената на файловете започват по един и същи начин, в папки с еднакви имена ли се намират в архивите, или и те се различават някак, и има ли на същите места файлове, имената на които започват по същия начин, но не трябва да се трият?
Активен

"Да си добре приспособен към болно общество не е признак за добро здраве" - Джиду Кришнамурти

korea60

  • Напреднали
  • *****
  • Публикации: 189
    • Профил
Със сигурност има по-добри решения и с доста повече проверки, но може да погледнеш това (работи с зип архиви).

#!/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"
Активен

uphero

  • Напреднали
  • *****
  • Публикации: 117
  • Distribution: Elementary OS
    • Профил
    • WWW
Да, езикът в по-големия пример е bash, а в командите се използват инструменти за разархивиране. А като имената на файловете започват по един и същи начин, в папки с еднакви имена ли се намират в архивите, или и те се различават някак, и има ли на същите места файлове, имената на които започват по същия начин, но не трябва да се трият?
Не, няма папки.
В архива има 2 файла - единия започва с Readme... другия със различно име.
Този който започва с  Readme... трябва да се изтрие.
Активен

Тук съм за да се уча,не се чудете на тъпите ми въпроси :)

neter

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 3408
  • Distribution: Debian, SailfishOS, CentOS
  • Window Manager: LXDE, Lipstick
    • Профил
    • WWW
Код
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, ако текущо не са ти инсталирани.
Активен

"Да си добре приспособен към болно общество не е признак за добро здраве" - Джиду Кришнамурти