Получить полный путь к файлу и его размер, используя awk - PullRequest
0 голосов
/ 26 апреля 2018

Я хочу получить file names followed by their size для всех файлов, имеющих размер в МБ или ГБ.Я сделал это до сих пор:

LIST=$(ls -lh -d -1 $PWD/{*,} | awk '{ print $9":"$5 }')
for i in $LIST
do
    if [[ $( echo "$i" | cut -f2 -d: | egrep "M|G" | wc -l) -ne 0 ]]
                                     # egrep not working, only finds M
    then
            echo "$i" >> bigfiles
    fi
done

То, что я получаю, это:

amit@C0deDaedalus:~$ test/findbig
/home/amit/Batch:3.8M
/home/amit/Black:3.6M

То, что я хочу, это:

amit@C0deDaedalus:~$ test/findbig
/home/amit/Batch File Programming.pdf:3.8M
/home/amit/Black Panther - Legend Has It ( Instrumental ).opus:3.6M

По сути, всеработает нормально, за исключением filenames, которые я получаю, не завершены.Показывается только первое слово.Я не могу понять, есть ли что-то не так с логикой или синтаксисом, но я думаю, что это как-то связано с awk.

Итак, как мне получить полные пути к файлам (с пробелами вмежду) в выводе?

Я пробовал трюк с циклом в awk , но не знаю, как заставить оба столбца вписаться.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Вы можете использовать read и удобное вхождение имени файла справа от списка ls -l. read помещает все «лишние» поля в конечную переменную:

function f_getfields
{
   local perm lnk uname grp size d1 d2 d3 filename
   while read perm lnk uname grp size d1 d2 d3 filename
   do
      echo "$filename $size"
   done <  <(ls -l)
}

f_getfields
0 голосов
/ 26 апреля 2018

Проблема связана с пробелами в именах файлов. Цикл for использует пробелы в качестве разделителя. Поэтому первым элементом в вашем списке будет «/ home / amit / Batch», вторым элементом «File» и так далее.

Вы можете использовать цикл while вместо for, что-то вроде:

ls -lh -d -1 $PWD/{*,} | awk '{ print $9":"$5 }' | while read LINE
do
    echo ${LINE}
    # do your stuff here
done

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

$ du -a | sort -rn | head
...