2

У меня странная проблема с ассоциативными массивами в bash.

У меня есть следующие файлы в каталоге:

ls -lart
drwxr-xr-x. 3 root root 4096 Feb  9 11:14 ..
-rw-r--r--  1 root root 3275 Feb  9 14:16 1.txt
-rw-r--r--  1 root root 3275 Feb  9 14:16 2.txt
-rw-r--r--  1 root root 3275 Feb  9 14:16 3.txt
-rw-r--r--  1 root root    0 Feb 12 15:19 a.txt
-rw-r--r--  1 root root    0 Feb 12 15:19 123.txt
drwxr-xr-x  2 root root 4096 Feb 12 15:19 .

Файлы перечислены от самых старых до самых новых.

-Отправить вывод команды ls -lart в файл с помощью следующей команды:

ls -lart --block-size=K /test |grep txt |awk '{print $9,$5}'  > /tmp/filestodel.txt

У файла filestodel.txt есть список файлов (с соответствующим размером) от самого старого до самого нового:

   cat /tmp/filestodel.txt
    1.txt 4K
    2.txt 4K
    3.txt 4K
    a.txt 0K
    123.txt 0K

где первый столбец имеет имя файла, а второй размер (в килобайтах)

-Я определяю массив и вставляю в него следующие записи:

declare -A cleanup
while read line
    do
    filetodelname=$(echo $line | awk {'print$1'});
    filetodelsize=$(echo $line | awk {'print$2'});
    cleanup[$filetodelname]=$filetodelsize
    done < /tmp/filestodel.txt

Идея состоит в том, чтобы удалить файлы, перечисленные в массиве th, от самого старого (первого) до самого нового, что будет означать начало удаления файла 1.txt в соответствии с выводом ls -lart выше.

Проблема в том, что когда я перебираю ключи:

for K in "${!cleanup[@]}"; do echo $K; done   #print filenames

Я получаю этот вывод:

2.txt
3.txt
123.txt
1.txt
a.txt

который явно запутался!

Как я могу сохранить исходный порядок файлов в массиве?

Спасибо дом

1 ответ1

0

Вам понадобится 2 массива, индексируйте их по номеру в первом проходе: первый получит имена, второй - размеры; затем индексируйте их по номеру (от 0 до number_of_files - 1) снова во втором проходе, когда выполняете удаление.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .