Удалить несколько подкаталогов, имеющих определенный тип файла

  string='abc=something|efgh=anotherThing|klmnop=yet_another_thing'
  string='|'$string    #to prepend with '|' and have a pattern
  result=$( echo "$string" | sed 's/|[a-zA-Z]*=/|/g' )
  result=${result:1}   # remove the leading '|' we added

  something|anotherThing|yet_another_thing
1
11.02.2021, 10:26
2 ответа

Команда findхорошо подходит для такого рода задач.

Позвольте мне сначала настроить некоторые файлы для тестирования:

$ mkdir -p tmp/testing/{1..100}
$ find tmp/testing -mindepth 1 | shuf | head -50 | while read d; do touch "$d"/foo.dlg; done

Это создало сотню каталогов, и 50 случайных из них содержали какой-то файл с именем foo.dlg. Теперь мы хотим переместить их куда-нибудь:

$ mkdir tmp/testing2/
$ find tmp/testing -type f -regex ".*\.dlg" -exec dirname {} + | while read d; do mv "$d" tmp/testing2/; done

Эта команда findищет все файлы с расширением.dlg в папке tmp/testingи выполняет для них dirname. Команда dirnameпринимает длинный список файлов или каталогов и возвращает список каталогов, соответствующих аргументам.

Итак, получив все эти имена каталогов, мы передаем их в цикл, который и выполняет перемещение. Естественно, вы можете использовать mv -v, если вам нужен более подробный отзыв о том, что произошло.

0
18.03.2021, 22:31
find. -type d -exec sh -c '
    for dir; do
        ls -- "$dir/"*.dlg >/dev/null 2>&1 && \
        echo mv -v -- "$dir" /move/to/tmp/;
    done
' sh {} + 

удалите echoдля команды mv, которая используется для пробного -запуска для перемещения каталогов.

1
18.03.2021, 22:31

Теги

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