Переименуйте файлы в любой глубокой подпапке, например в родительской папке, и переместите их в центральную папку

Мне кажется, что строки, которые вам нужны, имеют четыре поля с разделителями -двоеточиями, поэтому грубое регулярное выражение будет:

grep -E '^[^:]+[^: ]+:[^: ]+:[^: ]+:' < input > output

Для этого требуется строка, которая:

  • начинается с не -символов двоеточия(^[^:]+)
  • за которым следует что-то, что не содержит двоеточий или пробелов([^: ]+)
  • после двоеточия(:)
  • за которым следует что-то, что не содержит двоеточий или пробелов([^: ]+)
  • после двоеточия(:)
  • за которым следует что-то, что не содержит двоеточий или пробелов([^: ]+)
  • после двоеточия(:)
0
01.12.2020, 19:57
1 ответ
#! /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, когда результат вас удовлетворит.

0
18.03.2021, 22:45

Теги

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