Использование оболочки находит все подкаталоги, содержащие определенные файлы

Я бы предложил python с соответствующими библиотеками в качестве хорошего варианта.

Это не совсем замена, поскольку язык python не так специализирован для математики, как синтаксис matlab / mathematica, но он сочетает относительно хороший синтаксис для интерактивной математики с полностью способным языком программирования.

Вам захочется установить пакеты:

ipython - гораздо более приятная версия стандартной оболочки python с сохранением сеанса, заполнением табуляции и т. д. См. их сайт. Вы также можете захотеть ipython-notebook, который предоставляет интерактивную сессию на основе браузера (см. Изображение ниже).

ipython - гораздо более приятная версия стандартной оболочки python с сохранением сеанса, заполнением табуляции и т. д. См. их веб-сайт. Вы можете также хотеть ipython-notebook, который предоставляет интерактивный сеанс на основе браузера (см. Рисунок ниже). spyder - Обычно я просто использую эти библиотеки с текстовым редактором и сеансом терминала ipython, но если вы больше удобно со встроенной средой, вы можете посмотреть на spyder, IDE, разработанную в вене Matlab / mathematica с использованием вышеупомянутых библиотек. См. Снимок экрана ниже.

ipython notebook

2
задан 9 May 2012 в 18:17

3 ответа

Я бы интерпретировал ваши требования как «найти все подкаталоги, которые содержат все определенные файлы»

#!/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» содержит фактическое имя каталога, даже если оно содержит пробелы или специальные символы.

1
ответ дан 25 May 2018 в 11:39

Если я правильно понимаю, что вы хотите сделать, это решение:

#!/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. Итак, в то время как цикл строит список параметров, то этот список объединяется в одну команду и оценивается.

Удачи ...

1
ответ дан 25 May 2018 в 11:39
  • 1
    Спасибо. У меня проблемы с тестированием, так как это на виртуальной машине, и я, похоже, не знаю, как найти имя каталогов. Однако я это рассмотрю, спасибо! – Kalec 9 May 2012 в 18:59
  • 2
    Взгляните на wikihow.com/Write-a-Shell-Script-Using-Bash-Shell-in-Ubuntu , если у вас есть проблемы с использованием примера. – Thomas 9 May 2012 в 19:07

Если я правильно понимаю, что вы хотите сделать, это решение:

#!/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. Итак, в то время как цикл строит список параметров, то этот список объединяется в одну команду и оценивается.

Удачи ...

1
ответ дан 6 August 2018 в 01:22

Другие вопросы по тегам:

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