Как проверить длину файла, который находится внутри 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}
выводит имя файла