Удалить элементы из одного массива, которые присутствуют в другом массиве? - PullRequest
0 голосов
/ 18 января 2020

Я загружаю список файлов, однако я хочу оптимизировать, чтобы он не загружал go, если он уже загружен. Я думал о создании массива с myfiles=$(ls *.jpg); а затем исключить эти файлы из моего списка файлов myDownload=$(cat SiteFiles.txt). В конце концов необходимо удалить элементы из myfiles из myDownload . Интересно, возможно ли это вообще и могут ли быть проблемы, такие как недостаточная умность? Например, [ab c d] не может найти b во вторичном массиве, например [1 a 2 b 3 c 4 d], поскольку массивы не соответствуют порядку следования.

Ответы [ 2 ]

0 голосов
/ 18 января 2020

Другой вариант

myfiles=( $(ls *.jpg) ) # add files to an array
myDownload=$(cat SiteFiles.txt) # add list to a var
# remove existing file from download list if exist
for item in "${myfiles[@]}"; { myDownload=${myDownload//$item/}; }
echo $myDownload
0 голосов
/ 18 января 2020

Попробуете ли вы следующее:

declare -A ihaveit      # create an associative array
for f in *.jpg; do
    (( ihaveit[$f]++ )) # set a mark for files at hand
done

while read -r f; do
    [[ -z ${ihaveit[$f]} ]] && myDownload+=("$f")
                        # if the file in the SiteFiles.txt is not in my list
                        # then append it to the download list
done < SiteFiles.txt

echo "${myDownload[@]}" # see the result

Если вы предпочитаете одну строку, а имена файлов не содержат новых строк, вы также можете сказать что-то вроде:

comm -2 -3 <(sort SiteFiles.txt) <(ls -1 *.jpg | sort)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...