Поиск каталогов, не содержащих файл, только в каталогах, ведущих к определенному каталогу

Оказывается, из-за переменной PATH в наших окнах мы связывались с drush, отличным от предыдущей установки. Этот драш отправлял несовпадающую цитату на удаленный хост, который отправлял обратно ошибки sh.

Мы обновили путь (после тестирования, указав полный путь к drush ), и теперь он работает.

0
23.07.2019, 20:21
2 ответа

Итак, вы хотите просмотреть каталоги вида */analysis, исключая определенные подкаталоги.

Вместо поиска всего под .ищите только под */analysis.

Чтобы исключить подкаталог, используйте -prune. Это действие указывает find не проходить рекурсивно по этому подкаталогу.

Наконец, чтобы проверить, существует ли файл, соответствующий шаблону, вам нужно вызвать оболочку. Вы вызываете testнепосредственно из find, но testне выполняет сопоставление с образцом, поэтому проверяется только наличие файла, имя которого содержит буквальный символ *. Вызовите sh, передав ему имя каталога в качестве аргумента :-exec sh -c '…' {} \;. В коде sh разверните подстановочный знак, чтобы создать список соответствующих файлов, и проверьте, существует ли хотя бы один существующий файл.

find./*/analysis -name "doc" -prune -o -name "gold" -prune -o \
     -type d \! -exec sh -c 'set -- "$0"/*_out.csv; test -e "$1"' {} ';' -print

(Я предполагаю, что не существует оборванных символических ссылок, имя которых заканчивается на _out.csv.)

1
28.01.2020, 02:29

Ваша задача дублирует этот вопрос . Та же стратегия сработает:

  1. Найдите все ваши *_файлы out.csv, удалите базовое имя и уникируйте список.

  2. Найдите все каталоги, которые, как вы надеетесь, будут иметь *_файлы out.csv, и удалите записи в списке 1 из списка на шаге 2.

Этот сценарий делает это с выходными дескрипторами:

echo "csv files exist in:"
find. -type f -name \*_out.csv | sed -e 's/\/[^\/]*$//' |  
    sort -u | tee csv-dirs.txt

echo
echo "dirs we hope would have csv's:"
find. -type d | egrep '/analysis/' | egrep -v '/(doc|gold)(/.*|)$' |  
    tee all-dirs.txt

echo
echo "all dirs less the ones that do have csv's:"
egrep -vxFf csv-dirs.txt all-dirs.txt

Немного сжато, это может быть просто:

$ find. -type f -name \*_out.csv |  
    sed -e 's/\/[^\/]*$//' | sort -u > csv-dirs.txt
$ find. -type d | egrep '/analysis/' |  
    egrep -v '/(doc|gold)(/.*|)$' | egrep -vxFf csv-dirs.txt
./case1/analysis/test2
./case2/analysis/test3
1
28.01.2020, 02:29

Теги

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