Два расширения параметров оболочки одно за другим не работают (Bash) - PullRequest
0 голосов
/ 12 июля 2020

Использование Bash 4.4 Я пытаюсь получить список файлов из текущего каталога, поместить их в массив, а затем использовать расширение параметра оболочки, чтобы удалить файлы, содержащие / cache / и / tmp / in их пути из массива.

Это то, что у меня есть, но это не работает. Проблема, похоже, в том, что вторая замена строки происходит до того, как первая сохранит свой результат в first_array. Итак, first_array еще не имеет значения, когда выполняется вторая замена, в результате чего second_array остается пустым. Цель состоит в том, чтобы получить список файлов с отметкой времени от вчерашней даты, которые не содержат / cache / или / tmp / в своих путях.

#!/bin/bash

FIND="$(find . -type f -newermt $(date -d 'yesterday 13:00' '+%Y-%m-%d') ! -newermt $(date '+%Y-%m-%d'))"
readarray -t my_array <<<"$FIND"
first_array="${my_array[@]//*\/tmp\/*/}"
second_array="${first_array[@]//*\/cache\/*/}"

Ответы [ 2 ]

4 голосов
/ 12 июля 2020

Фильтрация нежелательных путей внутри find и заполнение массива выводом с разделителями null из find:

readarray -d '' -t my_array < <(
  find . -type f \
    -not \( \
      -path '*/tmp/*' -o -path '*/cache/*' \
    \) \
    -newermt "$(date -d 'yesterday 13:00' '+%Y-%m-%d %H:%M:%S')" \
    -not -newermt "$(date '+%Y-%m-%d')" \
    -print0
)
3 голосов
/ 12 июля 2020

first_array не является массивом; это строка, разделенная пробелами. При присвоении second_array, если любой из исходных элементов массива имел tmp или cache, вся строка удаляется.

FIND="$(find . -type f -newermt $(date -d 'yesterday 13:00' '+%Y-%m-%d') ! -newermt $(date '+%Y-%m-%d'))"
readarray -t my_array <<<"$FIND"

# Use array assignment so that each element of my_array becomes a separate
# element of first_array
first_array=("${my_array[@]//*\/tmp\/*/}")

# Ditto for first_array -> second_array
second_array=("${first_array[@]//*\/cache\/*/}")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...