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
Команда 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
, если вам нужен более подробный отзыв о том, что произошло.
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
, которая используется для пробного -запуска для перемещения каталогов.