Решением без передачи в другом месте было бы передать имя каталога в подоболочку в функции find exec .
Это будет не так эффективно, и, конечно, он попытается удалить несуществующие каталоги, если они уже были удалены.
find . -depth -type f -name 'things.txt' -exec sh -c 'rm -rf "$(dirname $0)"' {} \;
Если вы хотите использовать xargs , вы можете сделать это очень просто, вот так. Обратите внимание, что dirname принимает только один аргумент, поэтому вы должны указать -n 1 чтобы xargs передавал только один:
find . -depth -type f -name 'things.txt' | xargs -n 1 dirname | uniq | xargs rm -rf
Это не будет безопасно, если имя вашего каталога содержит символ новой строки, так что имейте это в виду.