Я бы предложил python с соответствующими библиотеками в качестве хорошего варианта.
Это не совсем замена, поскольку язык python не так специализирован для математики, как синтаксис matlab / mathematica, но он сочетает относительно хороший синтаксис для интерактивной математики с полностью способным языком программирования.
Вам захочется установить пакеты:
ipython - гораздо более приятная версия стандартной оболочки python с сохранением сеанса, заполнением табуляции и т. д. См. их сайт. Вы также можете захотеть ipython-notebook, который предоставляет интерактивную сессию на основе браузера (см. Изображение ниже).ipython - гораздо более приятная версия стандартной оболочки python с сохранением сеанса, заполнением табуляции и т. д. См. их веб-сайт. Вы можете также хотеть ipython-notebook, который предоставляет интерактивный сеанс на основе браузера (см. Рисунок ниже). spyder - Обычно я просто использую эти библиотеки с текстовым редактором и сеансом терминала ipython, но если вы больше удобно со встроенной средой, вы можете посмотреть на spyder, IDE, разработанную в вене Matlab / mathematica с использованием вышеупомянутых библиотек. См. Снимок экрана ниже.
Я бы интерпретировал ваши требования как «найти все подкаталоги, которые содержат все определенные файлы»
#!/bin/bash
parent_dir="$1"
shift
find "$parent_dir" -type d |
while IFS= read -r subdir; do
all_present=true
for file in "$@"; do
if [[ ! -f "$subdir/$file" ]]; then
all_present=false
break
fi
done
$all_present && echo "$subdir"
done
части «IFS =» и «read -r» гарантируют, что значение «dir» содержит фактическое имя каталога, даже если оно содержит пробелы или специальные символы.
Если я правильно понимаю, что вы хотите сделать, это решение:
#!/bin/sh
USAGE="Usage: $0 dir file1 file2 ... fileN\nto find all subdirectories of dir that contain all the given files.\n"
if [ "$#" == "0" ]; then
printf "$USAGE"
exit 1
fi
ARG=""
DIR=$1
shift
while (( "$#" )); do
ARG="$ARG -exec test -e \"{}/$1\" \; "
shift
done
cmd="find $DIR -type d $ARG -print"
eval $cmd
Что это такое:
Использование find ... -type d для поиска всех подкаталогов (включая каталог, заданный как первый параметр). Команда test -e проверяет, существует ли файл. Поэтому для данного каталога мы должны проверить все файлы, указанные в командной строке: test -e / path / to / directory / file1 test -e / path / to / directory / file2 test -e / path / to / directory / file3 ... /path/to/directory - {} - единственный результат поиска. Затем параметр find -exec можно использовать для проверки одного файла. Для проверки всех файлов требуется несколько параметров -exec test. Итак, в то время как цикл строит список параметров, то этот список объединяется в одну команду и оценивается.
Удачи ...
Если я правильно понимаю, что вы хотите сделать, это решение:
#!/bin/sh
USAGE="Usage: $0 dir file1 file2 ... fileN\nto find all subdirectories of dir that contain all the given files.\n"
if [ "$#" == "0" ]; then
printf "$USAGE"
exit 1
fi
ARG=""
DIR=$1
shift
while (( "$#" )); do
ARG="$ARG -exec test -e \"{}/$1\" \; "
shift
done
cmd="find $DIR -type d $ARG -print"
eval $cmd
Что это такое:
Использование find ... -type d
для поиска всех подкаталогов (включая каталог, заданный как первый параметр). Команда test -e
проверяет, существует ли файл. Поэтому для данного каталога мы должны проверить все файлы, указанные в командной строке: test -e / path / to / directory / file1 test -e / path / to / directory / file2 test -e / path / to / directory / file3 ... /path/to/directory
- {}
- единственный результат поиска. Затем параметр find -exec
можно использовать для проверки одного файла. Для проверки всех файлов требуется несколько параметров -exec test
. Итак, в то время как цикл строит список параметров, то этот список объединяется в одну команду и оценивается.
Удачи ...