Приведенная ниже команда в unix переименует все каталоги с именем Utility to Claim , если выполняется с верхнего уровня

 find . -type d -name Utility -exec sh -c 'mv "${0}" "${0%/Utility}/Claim"' {} \;

Однако я просто хочу переименовать каталог на последнем уровне Utility , а не на всех. Пример, если структура /Sample/Utility/version1/Utility/test.txt , я хочу переименовать только последнюю папку Utility , когда выполняется с верхнего уровня.

1 ответ1

1

Это мое предложение:

find . -type d -name Utility -print | sort -r | awk '{if(substr(p,1,length($0))!=$0) print $0; p=$0}' | while read i; do echo mv "${i}" "${i%Utility}Claim"; done

find используется для поиска всех каталогов с именем Utility в текущей папке и печати найденных имен.
Имена отсортированы в обратном порядке.
awk печатает только те строки (имена), которые не являются префиксом предыдущей строки (name). Это шаг, который, например, удаляет «/Sample/Utility», если он найден после «/Sample/Utility/version1/Utility».
Строки читаются в цикле оболочки, а затем я распечатываю нужные вам команды mv. Удалите "эхо", чтобы сделать mv s.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .