Получить все файлы, кроме файлов в массиве - Bash

Неважно. pbuilder-dist update делает именно то, что здесь необходимо.

5
10.08.2017, 15:04
2 ответа

С помощью bashвы можете сделать:

all=(*)
except=(file1 file2 notme.txt)
only=()
IFS=/
for file in "${all[@]}"; do
  case "/${except[*]}/" in
    (*"/$file/"*) ;;     # do nothing (exclude)
    (*) only+=("$file")  # add to the array
  esac
done
ls -ld -- "${only[@]}"

(это работает здесь для файлов в текущем каталоге, но не надежно для глобусов, таких как all=(*/*) кроме =(foo/bar), так как мы используем /для объединения элементов массива для поиска).

Это основано на том факте, что "${array[*]}"объединяет элементы массива с первым символом $IFS(здесь выбрано /иначе он не может встречаться в файле name; NUL — это символ, который не может встречаться в файле path, но, к сожалению, bash(в отличие от zsh) не может иметь такого символа в своих переменных). Таким образом, для каждого файла в $all(здесь, например, $fileявляется foo), мы выполняем case "/file1/file2/ notme.txt/" в (*"/foo/"*), чтобы проверить, следует ли исключить $file.

6
27.01.2020, 20:33

С zshпроще:

except=(file1 file2 notme.txt)
all=(*)
only=(${all:|except})
ls -ld -- $only

Мнемоника для ${all:|кроме}: элементы из $allbarте из $кроме.

Вы также можете проверить, находятся ли файлы в массиве $exceptкак часть квалификатора glob:

ls -ld -- *.txt(^e:'((except[(Ie)$REPLY]))':)

Или с помощью функции:

in_except() ((except[(Ie)${1-$REPLY}]))
ls -ld -- *.txt(^+in_except)
5
27.01.2020, 20:33

Теги

Похожие вопросы