2016-07-08 2 views
3

Я пытаюсь создать сценарий, который получает расширение и сообщает в двух столбцах, пользователю и количестве файлов, которые пользователь владеет этим расширением. Результаты должны быть напечатаны в report.txtОтчет с cut и grep

Вот мой код.

#!/bin/bash 

#Uncoment to create /tmp/test/ with 50 txt files 
#mkdir /tmp/test/ 
#touch /tmp/test/arch{01..50}.txt 

clear 

usage(){ 
    echo "The script needs an extension to search" 
    echo "$0 <extension>" 
} 

if [ $# -eq 0 ]; then 
    usage 
    exit 1 
fi 

folder="/tmp/test/" 
touch report.txt 
count=0 
pushd $folder 

for file in $(ls -l); do 
    grep "*.$1" | cut -d " " -f3 >> report.txt 
done 

popd 

Программа работает бесконечно. И я даже не считаю файлы для каждого пользователя. Как я могу решить это, используя только grep и cut?

+0

Можете ли вы дать вход и ожидаемый результат? – Fazlin

+3

'grep * *. $ 1" | ... 'greps ins stdin. Ваша программа ждет вас навсегда. У меня нет аргумента файла или отсутствует входной канал. –

+0

вы можете заменить цикл for на что-то вроде 'find $ folder -name '*. $ 1" -printf "% P \ t% u \ n" >> report.txt', а затем некоторый wc. –

ответ

2

С GNU stat:

stat -c '%U' *."$1" | sort | uniq -c | awk '{print $2,"\t",$1}' > report.txt 

Как отметил mklement0 под BSD/OSX вы должны использовать -f вариант с stat:

stat -f '%Su' *."$1" | sort | uniq -c | awk '{print $2,"\t",$1}' > report.txt 

Edit:

К обрабатывать много файлов и избегать ограничения количества аргументов, вам лучше использовать printf конвейеру команде stat (еще раз спасибо mklement0):

printf '%s\0' *."$1" | xargs -0 stat -c '%U' | sort | uniq -c | awk '{print $2,"\t",$1}' 
+1

Прекрасно сделано; в дополнение к вашему синтаксису GNU 'stat' с кодом для BSD/OSX' stat': '-c '% U'' должен быть заменен на' -f'% Su''. – mklement0

+1

Хороший ответ. Только одно. В зависимости от количества файлов, которые откроет glob, список аргументов для 'stat' может занять слишком много времени. Решение 'find' будет более стабильным. – hek2mgl

+1

@ hek2mgl: Это актуальная проблема, но вы можете исправить это с помощью 'printf '% s \ 0' *." $ 1 "| xargs -0 stat ... '(так как' printf' является Bash _builtin_, он не подлежит максимальному ограничению длины командной строки). – mklement0

0

Вам не нужна петля для этого (если вы позже не нужно перебрать несколько папок), и изменение рабочего каталога в скрипт редко необходимо. Кроме того, чтение ls выход обычно не рекомендуется.

Вот версия, которая заменяет цикл, и использует du:

ext="$1" 

printf "Folder '%s':\t" "$folder" >>report.txt 

du -hc "$folder"/*."$ext" | sed -n '$p' >>report.txt 
+1

Я думаю, что OP хочет _count_ файлов, а не комбинированный размер хранилища. Кроме того, вам не хватает группировки по имени пользователя владельца. – mklement0

+0

@ mklement0 Я интерпретировал «количество файлов» как «объединенный размер файлов». Это не совсем ясно. Я также предполагал, что '$ folder' позже будет использоваться для идентификации имен пользователей (домашних каталогов). – Kusalananda

Смежные вопросы