Выбрать файлы в каталоге, которые имеют более 'n' строк в сценарии оболочки?

Я пытаюсь выбрать файлы, содержащие более n строк в сценарии оболочки, и переместить их в другой каталог.

Следующая команда отлично работает из командной строки, но не в сценарии оболочки:

MY_PATH='/var/www/'
find $MY_PATH -maxdepth 1 -type f -name 'authuser-*' | xargs  wc -l |   awk '{if($1 >= 5) print $1}

Но когда в сценарии оболочки

files_count=`find $MY_PATH -type f  -name 'authuser-*' | xargs  wc -l | awk '{if($1 > 5) print $2}'`
echo $files_count
exit 1

В настоящее время я использую эту полную команду

find /var/www/ -maxdepth 1 -type f -name 'authuser-*'| xargs  wc -l |   awk '{if($1 >= 5) print $2}' | awk '{if($1 !="total") print $1}' | xargs -i basename {} | head -$5 

В чем может быть проблема? есть ли другое решение для этого?


person Dinesh Kumar Sarangapani    schedule 23.10.2012    source источник


Ответы (4)


Проблема с командой поиска:

find "$MY_PATH" -type f  -name 'authuser-*'

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

#!/bin/sh
mypah='./'
var=`find "$mypah" -name "temp" | xargs nawk '{a[FILENAME]++}END{for(i in a){if(a[i]>5)print i}}'`

echo $var
person Vijay    schedule 23.10.2012

На самом деле я думаю, что вы добавляете слишком много команд, передаваемых по каналам, для выполнения простой работы. Учтите это для выбора всех файлов со строками больше 5:

 find /var/www/ -maxdepth 1 -type f -name 'authuser-*' \
                    -exec awk 'END {if (NR > 5) print FILENAME}' {} \;
person anubhava    schedule 23.10.2012
comment
Это просто обратная косая черта, а не труба, чтобы показать вам полную команду с полосами прокрутки. Обратная косая черта используется в оболочках как символ продолжения строки. - person anubhava; 23.10.2012

Установили ли вы ваш ПУТЬ в скрипте? PATH='/var/www/'

В противном случае ваш сценарий будет использовать системную переменную PATH, а не установленную вами переменную PATH. Кроме того, я не понимаю, почему ваша команда не будет работать в сценарии, если она работает из командной строки.

Кроме того, вы не должны использовать PATH для установки собственного пути. Вы можете выбрать другое имя, например, MY_PATH.

person P.P    schedule 23.10.2012
comment
Нет, на самом деле, я не использовал PATH. Меня беспокоит то, что awk '{if($1 ›= 5) print $2}' проходит для всех файлов - person Dinesh Kumar Sarangapani; 23.10.2012
comment
Это означает, что все файлы имеют не менее 5 строк. Попробуйте с более высоким числом, например 100. - person P.P; 23.10.2012

Похоже, вы делаете это НАМНОГО сложнее, чем необходимо:

n=5
for file in authuser-*
do
    (( $(wc -l <"$file") > "$n" )) &&
    mv "$file" wherever...
done

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

person Ed Morton    schedule 23.10.2012