Попробуйте это,
cd /source/dir/path
find. -type d -exec mkdir -p -- /destination/directory/{} \;
. -type d
Рекурсивный список каталогов по текущему пути. mkdir -p -- /destination/directory/{}
создать каталог в месте назначения. Это основано на find
, который поддерживает раскрытие {}
в середине слова-аргумента.
Вот один из способов предположить, что ваши данные такие, как вы показываете, и у вас нет ничего похожего на Foo 12, 0000
, что не следует рассматривать как дату):
$ sed -E 's/([A-Z][a-z]+) ([0-9]{1,2}), ([0-9]{4})\b/\2 \1 \3/g' file
on that date 02 April 2020 end of line
5 March 2021 helloooo world
J 14, 2022
error 3, bye
Ищем заглавную букву, за которой следует одна или несколько строчных букв ([A-Z][a-z]+
), затем пробел и одну или две цифры ([0-9]{1,2}
), затем запятую и пробел и ровно 4 цифры, за которыми следует слово -граница(\b
:переход слова в не -слово; это будет соответствовать пробелу, концу строки или чему-то еще, что не является символом слова ). Скобки заключают соответствующие группы в \1
, \2
и \3
, которые мы затем используем для замены.
Обратите внимание, что это не работает для J 14, 2022
, так как это недопустимая дата. Например, M 14 2020
— это 14 марта или мая? Если вы действительно хотите сопоставить подобные вещи, вы можете попробовать:
$ sed -E 's/([A-Z][a-z]*) ([0-9]{1,2}), ([0-9]{4})\b/\2 \1 \3/g' file
on that date 02 April 2020 end of line
5 March 2021 helloooo world
14 J 2022
error 3, bye
Наконец, вы также можете сделать это немного более конкретным, ища только заглавные буквы, которые можно найти в качестве первой буквы месяца:
sed -E 's/([JFMASOND][a-z]*) ([0-9]{1,2}), ([0-9]{4})\b/\2 \1 \3/g' file