Мне кажется, что строки, которые вам нужны, имеют четыре поля с разделителями -двоеточиями, поэтому грубое регулярное выражение будет:
grep -E '^[^:]+[^: ]+:[^: ]+:[^: ]+:' < input > output
Для этого требуется строка, которая:
^[^:]+
)[^: ]+
):
)[^: ]+
):
)[^: ]+
):
)#! /bin/bash
shopt -s globstar #enabled for '**' to match all files &directories recursively
#shopt -s dotglob #uncomment to enable to match on hidden files/directories too
cd /path/to/directory/Root
for pathname in **/*; do
[[ -f "$pathname" ]] && echo mv -v -- "$pathname" "${pathname%%/*}/${pathname%%/*}.${pathname##*.}";
done
##then remove remained empty directories
for pathname in **/*; do
[[ -d "$pathname" && -z "$(ls -A -- "$pathname")" ]] && rm -r -- "$pathname";
done
[[ -f "$pathname" ]]
проверяет, является ли $pathname
файлом f
${pathname%%/*}
:С помощью оболочки -параметра -расширения вырежьте самый длинный суффикс из параметра pathname
. сокращает все до -до первой косой черты /
. ${pathname##*.}"
:то же самое, но вырезает самый длинный префикс из параметра pathname
; сокращает все до -до последней точки .
. [[ -d "$pathname" ]]
проверяет, является ли $pathname
каталогом d
... && -z "$(ls -A -- "$pathname")"
проверяет, является ли базовое имя каталогаpathname
пустым или нет . удалите echo
, когда результат вас удовлетворит.