2010-02-24 4 views
0

У меня возникают довольно необычные проблемы с использованием grep в скрипте bash. Ниже приведен пример кода сценария Баш, который я использую, который показывает поведение:Проблемы с командой Grep в скрипте bash

UNIQ_SCAN_INIT_POINT=1 
cat "$FILE_BASENAME_LIST" | uniq -d >> $UNIQ_LIST 
sed '/^$/d' $UNIQ_LIST >> $UNIQ_LIST_FINAL 
UNIQ_LINE_COUNT=`wc -l $UNIQ_LIST_FINAL | cut -d \ -f 1` 
while [ -n "`cat $UNIQ_LIST_FINAL | sed "$UNIQ_SCAN_INIT_POINT"'q;d'`" ]; do 
    CURRENT_LINE=`cat $UNIQ_LIST_FINAL | sed "$UNIQ_SCAN_INIT_POINT"'q;d'` 
    CURRENT_DUPECHK_FILE=$FILE_DUPEMATCH-$CURRENT_LINE 
    grep $CURRENT_LINE $FILE_LOCTN_LIST >> $CURRENT_DUPECHK_FILE 
    MATCH=`grep -c $CURRENT_LINE $FILE_BASENAME_LIST` 
    CMD_ECHO="$CURRENT_LINE matched $MATCH times," cmd_line_echo 
    echo "$CURRENT_DUPECHK_FILE" >> $FILE_DUPEMATCH_FILELIST 
    let UNIQ_SCAN_INIT_POINT=UNIQ_SCAN_INIT_POINT+1 
done 

Во многих случаях, когда оглавлению для текущей строки в списке местоположения файла, он не положил никакого выхода к току dupechk, несмотря на то, что определенную совпадение с текущей строкой в ​​списке местоположений файлов (я запускал команду в терминале без проблем).

Я порылся по интернету, чтобы узнать, было ли у кого-либо другое подобное поведение, и до сих пор все, что я нашел, это то, что он связан с буферизированными и небуферированными выходами других команд, работающих до команды grep в Bash script ....

Однако никто, кажется, не нашел решение, поэтому в основном я спрашиваю вас, ребята, если вы когда-либо сталкивались с этим, и любая идея/советы/решения этой проблемы ...

С уважением

Пол

+0

Что вы точно пытаетесь сделать? Мы могли бы предложить лучший способ сделать это. –

+0

У меня очень длинный сценарий bash, который должен выполнять операцию поиска дубликатов файлов в заданной директории. Эта часть скрипта находит дубликаты и печатает их в файле. Стоит отметить, что я делаю это для части университетской курсовой работы, и команда awk не разрешена. – paultop6

+0

Команда awk не разрешена, но sed/grep есть? lol – ghostdog74

ответ

1

«Проблема» - стандартная библиотека ввода-вывода. Когда он записывает на терминал , он небуферизируется, но если он записывает трубку, то он устанавливает буферизацию.

попытка изменения

CURRENT_LINE=`cat $UNIQ_LIST_FINAL | sed "$UNIQ_SCAN_INIT_POINT"'q;d'` 

в

CURRENT LINE=`sed "$UNIQ_SCAN_INIT_POINT"'q;d' $UNIQ_LIST_FINAL` 
+0

Lifesaver. Теперь я понимаю, что вы объяснили это, но никогда бы не подумали об этом иначе, спасибо! – paultop6

0

Есть ли какие-либо каталоги с пробелами в их именах в $FILE_LOCTN_LIST? Потому что, если они есть, эти пробелы будут каким-то образом экранированы. Некоторая комбинация find и xargs обычно может иметь дело с этим, особенно xargs -0

+0

В настоящее время я использую эту команду для компиляции $ FILE_LOCTN_LIST: echo $ SCAN_DIRNAME | xargs -I {/} find {/} -type f> $ FILE_LOCTN_LIST Я думаю, что xargs -I работает аналогично xargs -0? – paultop6

+0

Итак, это не будет экранирование, если это имя одного файла. –

0

Небольшой Баш скрипт с помощью md5sum и сортировки, который определяет дубликаты файлов в текущем каталоге:

CURRENT="" md5sum * | 
    sort | 
    while read md5sum filename; 
    do 
    [[ $CURRENT == $md5sum ]] && echo $filename is duplicate; 
    CURRENT=$md5sum; 
    done 
0

вы помеченной Linux, некоторые Я предполагаю, что у вас есть инструменты, такие как GNU find, md5sum, uniq, sort и т. д. Вот простой пример, чтобы найти дубликат f iles

$ echo "hello world">file 
$ md5sum file 
6f5902ac237024bdd0c176cb93063dc4 file 
$ cp file file1 
$ md5sum file1 
6f5902ac237024bdd0c176cb93063dc4 file1 
$ echo "blah" > file2 
$ md5sum file2 
0d599f0ec05c3bda8c3b8a68c32a1b47 file2 
$ find . -type f -exec md5sum "{}" \; |sort -n | uniq -w32 -D 
6f5902ac237024bdd0c176cb93063dc4 ./file 
6f5902ac237024bdd0c176cb93063dc4 ./file1 
Смежные вопросы