Фильтрация списка каталогов с помощью сценария оболочки - PullRequest
1 голос
/ 10 марта 2009

Если у меня есть переменная BASH:

Exclude="somefile.txt anotherfile.txt"

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

Files=  #some command here
someprogram ${Files}

someprogram должны быть указаны все файлы в определенном каталоге, кроме файлов в переменной ${Exclude} Изменение someprogram не вариант.

Ответы [ 4 ]

2 голосов
/ 10 марта 2009

Я не уверен, что вы взялись за сценарии оболочки Unix, но вот рабочий пример для bash:

#!/bin/bash

Exclude=("a" "b" "c")
Listing=(`ls -1Q`)

Files=( $(comm -23 <( printf "%s\n" "${Listing[@]}" ) <( printf "%s\n" "${Exclude[@]}"
) ) )

echo ${Files[@]}

Обратите внимание, что каждое имя файла в Exclude заключено в двойные кавычки и добавлено скобки вокруг них. Замените echo на someprogram, измените команду ls в каталог, который вы хотите изучить, и он должен работать. Ключом здесь является программа comm.

1 голос
/ 10 марта 2009

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

FILES=`find /tmp/my_directory -type f -maxdepth 1 -name "*.txt" -not -name somefile.txt -not -name anotherfile.txt`

где / tmp / my_directory - это путь, который вы хотите найти.

Вы можете создать список "-not -name blah -not -name blah2" из Исключений, если хотите с простым циклом for ...

0 голосов
/ 10 марта 2009

Предполагая имена файлов без пробелов или других патологических символов:

shopt -s extglob
Files=(!(@(${Exclude// /|})))
0 голосов
/ 10 марта 2009

Вот одна строка для стандартной командной строки Unix:

ls | grep -v "^ $ {Exclude} $" | xargs

У него есть одно предположение. $ {Exclude} должен быть правильно экранирован, чтобы такие символы как точка не интерпретировались как часть регулярного выражения.

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