У меня есть структура каталогов с 50000+ файлов.Имена файлов имеют вид <YYMMDD>-<NNN>.htm
.
Структура каталогов:
/<category>/<YYYY>/<MM>/
Например:
./Racing/1998/03/980320-001.htm
./Racing/1998/03/980320-002.htm
...
./General/1999/02/990221-001.htm
./General/1999/02/990221-002.htm
...
Я хочупростой список файлов в форме
<category>-<YYYY>-<MM>-<DD>-<NNN>
Таким образом, выше будет
Racing-1998-03-20-001.htm
Racing-1998-03-20-002.htm
...
General-1999-02-21-001.htm
General-1999-02-21-002.htm
Я (пере) изучаю bash & regex и будуценим несколько советов о том, как это реализовать.
Я знаю, как создать список путей, но не знаю, как применить регулярное выражение для преобразования формы.Я бы использовал find -type f -name "*.htm" | <some goblygook here>
, где <some goblygook here>
мог бы использовать xargs
...
Заранее спасибо.
[РЕДАКТИРОВАТЬ 3/30 9:58pm]
Согласно приведенным ниже ответам, я придумал этот сценарий.Я не могу заставить xargs
работать:
#!/bin/bash
mkdir ./flat
find -type f -name "*.htm" | \
awk -F'[/]' '
BEGIN{OFS="-"}
{ gsub(/^\.\//,"") ;print "./" $0 " ./flat/" $1,$2, substr($4,3,2),substr($4,5,2),substr($4,8)}
' | \
xargs -p -d "\n" -n 1 cp
Запуск этого дает мне:
$ ./awktest.sh
mkdir: cannot create directory `./flat': File exists
cp ./General/1997/05/970525-002.htm ./flat/General-1997-05-25-002.htm ?...y
cp: missing destination file operand after `./General/1997/05/970525-002.htm ./flat/General-1997-05-25-002.htm'
Try `cp --help' for more information.
^C
Копирование точной команды cp
(cp ./General/1997/05/970525-002.htm ./flat/General-1997-05-25-002.htm
) из этого вывода и вставка егопрямо в командной строке bash работает нормально.
Я попытался выяснить, как использовать -print0
в команде find
, но не смог понять, как заставить awk
использовать \0
в качестве ограничителя записи (RS="\0"
не будет работать),Я думаю, что проблема связана с переводом строки, но я в растерянности!