2016-01-13 6 views
-2

У меня возникли трудности с извлечением уникальных файлов разного размера.Сравнение двух файлов на основе размера

Вопрос: Внутри каталога имеется несколько файлов, предположим, 2 файла из 2 мб, 4 файла из 4 мб и 3 файла из 6 мб.

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

Например. если он читает файл f1 и его это 2mb файл, он будет делать Ls -al из f1

В следующий раз, если он получает файл 2 размера мб, он пропускает ее

и, следовательно, в этом случае он будет печатать только 3 файла с разным размером 2 мб 4 мб и 6 мб.

[[email protected] ~]$ ll mytestfolder/ 
total 38972 
-rw-rw-r-- 1 sumit.gupta sumit.gupta 2097152 Jan 6 23:26 f1 
-rw-rw-r-- 1 sumit.gupta sumit.gupta 2097152 Jan 6 23:27 f2 
-rw-rw-r-- 1 sumit.gupta sumit.gupta 4194304 Jan 6 23:28 f3 
-rw-rw-r-- 1 sumit.gupta sumit.gupta 4194304 Jan 6 23:28 f4 
-rw-rw-r-- 1 sumit.gupta sumit.gupta 6291456 Jan 6 23:28 f5 
-rw-rw-r-- 1 sumit.gupta sumit.gupta 6291456 Jan 6 23:28 f6 
-rw-rw-r-- 1 sumit.gupta sumit.gupta 4194304 Jan 13 11:11 f7 
-rw-rw-r-- 1 sumit.gupta sumit.gupta 4194304 Jan 13 11:12 f8 
-rw-rw-r-- 1 sumit.gupta sumit.gupta 6291456 Jan 13 11:12 f9 

Я пытаюсь ниже кодов в сценарии:

#!/bin/bash 

source="/home/sumit.gupta/mytestfolder/" 

ls -ltr /home/sumit.gupta/mytestfolder | cut -d ' ' -f 5,10 | \ 
    head -n -1 > /tmp/abc.txt 
ls -ltr /home/sumit.gupta/mytestfolder | cut -d ' ' -f5 | \ 
    uniq > /tmp/def.txt 
grep -F -vf /tmp/def.txt /tmp/abc.txt > xyz.txt 
+0

Пожалуйста, добавьте к вопросу о ваших результатах и ​​почему они не согласны с вашими желаниями. – msw

+0

И не анализируйте вывод 'ls' (http://mywiki.wooledge.org/ParsingLs), он добавляет проблемы, когда вы их не ожидаете. – msw

+0

Спасибо за отзыв. Вот вывод: [[email protected] ~] $ sh input.sh [[email protected] ~] $ [[email protected] ~] $ cat xyz.txt [[email protected] ~ ] $ Я получаю пустой результат. Благодаря @pax проблема решена. –

ответ

0

Предполагая, что вы не укушены обработке вывода ls (то есть, что вы выводите линии последовательно имеют размер в колонке 5 и не делайте странных вещей, таких как встраивание новых строк в имена файлов), это то, что можно легко сделать с помощью awk.

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

pax> ll mytestfolder/ | awk '!seen[$5] {print; seen[$5] = 1}' 
-rw-rw-r-- 1 sumit.gupta sumit.gupta 2097152 Jan 6 23:26 f1 
-rw-rw-r-- 1 sumit.gupta sumit.gupta 4194304 Jan 6 23:28 f3 
-rw-rw-r-- 1 sumit.gupta sumit.gupta 6291456 Jan 6 23:28 f5 
+0

u может создавать тестовые файлы, используя: (просто говоря;)) dd if =/dev/zero of =/directory/f1 bs = 1M count = 2 Однако ваша логика работает! Спасибо тонну за это. :) –

+0

@sumitgupta, подумал о лучшем решении, используя * just * 'awk' и один проход данных, что-то жизненно важное, если оно проходит через конвейер, как кажется. – paxdiablo

0

вы можете получить размер файла с помощью «du -h имя_каталога/имя_файла» и сравнить его с размером входного файла.