gpt4 book ai didi

linux - 需要展平一个目录,修改文件名。用庆典?

转载 作者:太空狗 更新时间:2023-10-29 11:39:49 24 4
gpt4 key购买 nike

我的目录结构包含 50,000 多个文件。文件名的格式为 <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 和正则表达式,希望能得到一些关于如何实现它的指示。

我知道如何生成路径列表,但不知道如何应用正则表达式来转换表单。我会用 find -type f -name "*.htm" | <some goblygook here>

哪里<some goblygook here>可能会利用 xargs ...

提前致谢。

[编辑 3 月 30 日晚上 9:58]

根据下面的回答,我编写了这个脚本。我无法获得 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 提示符中工作正常。

我试着弄清楚如何使用 -print0find 上命令但不知道如何获取 awk使用 \0作为记录终止符( RS="\0" 不起作用)。我认为问题与换行有关,但我不知所措!

最佳答案

查找-type f -name "*.htm"| sed 's@^./@@g;s@/@-@g' | awk -F'-' '{print $1 "-"$2 "-"$3 "-"substr($4, 5, 2) "-"$5}'

sed & awk对文本操作非常有用。

关于linux - 需要展平一个目录,修改文件名。用庆典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5494771/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com