Как проверить длину файла, который находится внутри zip-файла

Я хочу, чтобы файлы внутри почтового индекса не были пустыми. Я знаю unzip -l команда, но она дает много информации.

[abc@localhost test]$ unzip -l empty_file_test.zip
Archive:  empty_file_test.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
    0      07-05-2017 06:43   empty_first_20170505.csv
    0      07-05-2017 06:43   empty_second_20170505.csv
---------                     -------
    0                         2 files

Я извлек имена файлов из zip-файла по команде

file_names="$(unzip -Z1 empty_file_test.zip)
file_name_array=($file_names)
file1=${file_name_array[0]}
file2=${file_name_array[1]}

Я пытался с помощью -s вариант но не полезный

if [ -s $file1 ]; then
   echo "file is non zero"
else
   echo "file is empty"    
fi

Всегда печатает file is empty даже если файл не пустой.

2 ответа

Решение
unzip -l empty_file_test.zip | awk 'NR>=4{if($1==0){print $4}}'

может работать для вас, что также может быть написано как

unzip -l empty_file_test.zip | awk 'NR >= 4 && $1==0{print $4}'

Вы можете отформатировать вывод для распаковки -l

unzip -l test.zip | awk '{print $1 "\t"  $4}' | tail -n+4 | head -n-2

Объяснение:

unzip -l распаковывает файлы и возвращает нужную информацию

awk '{print $1 "\t" $4}' печатает столбцы 1 и 4 (размер и имя файла)

tail -n+4 удаляет первые несколько строк из вывода (удаляя заголовок и ненужную информацию)

head -n-2 убирает последние две строки из вывода (удаляя нежелательную сводку)

Редактировать:

Чтобы сохранить пустые файлы в массиве, вы можете отобразить вывод команды:

read -r -a array <<< `unzip -l test.zip | awk '{print $1 "\t"  $4}' | tail -n+4 | head -n-2 | awk '{if($1==0) print $2}'`

объяснение

unzip -l test.zip | awk '{print $1 "\t" $4}' | tail -n+4 | head -n-2 объяснено выше

awk '{if($1==0)}{print $2}' просто дает вам имена пустых файлов

<<< вводит вывод команды в обратных галочках `` в команду чтения

read -r -a array читает входные данные в массив переменных

НО

Вы можете просто использовать более короткую команду Sjsam и сделать то же самое:

read -r -a array <<< `unzip -l empty_file_test.zip | awk 'NR>=4{if($1==0){print $4}}'`

read -r -a array объяснено выше

<<< объяснено выше

awk 'NR>=4{if($1==0){print $4}}'

  • NR>=4 выводит каждую строку> 4 (лишить заголовок и нежелательный вывод)
  • if($1==0){print $4}} если размер ($0) равен 0, он выполняется {print $4}
  • {print $4} выводит имя файла
Другие вопросы по тегам