Bash/Python 将多个路径收集到一个并将文件名替换为“*”字符

Bash/Python to gather several paths to one and replacing the file name by '*' character

我正在编写 bash 脚本以自动生成 .spec 文件(构建 RPM)。我读取目录中的所有文件(我希望将其转换为rpm包)并将需要安装的文件的所有路径写入.spec文件中,我意识到我需要缩短它们。一个例子:

/tmp/a/1.jpg
/tmp/a/2.conf
/tmp/a/b/srf.cfg
/tmp/a/b/ssp.cfg
/tmp/a/conf_web_16.2/c/.htaccess
/tmp/a/conf_web_16.2/c/.htaccess.WebProv
/tmp/a/conf_web_16.2/c/.htprofiles

=> 我想得到什么:

/tmp/a/*.jpg
/tmp/a/*.conf
/tmp/a/b/*.cfg
/tmp/a/conf_web_16.2/c/*
/tmp/a/conf_web_16.2/c/*.WebProv

各位大侠请给我一些关于我的问题的建议。希望大家在bashshell、python或者C中提出自己的想法,先谢谢了。

要将第一个字符以外的字符中包含点的任何文件名转换为覆盖点之前部分的通配符,并将所有剩余文件转换为通配符,

sed -e 's%/[^/][^/]*\(\.[^./]*\)$%/*%' -e t -e 's%/[^/]*$%/*%'

sed的行为是一次读取一行输入,并依次执行每行的命令脚本。 s%foo%bar% 替换命令将正则表达式匹配替换为字符串,而 t 命令会导致脚本跳过进一步的替换(如果已在当前行执行替换)。 (我有点简化了。)第一个正则表达式匹配文件名中包含一个点而不是第一个的位置,并在一个反向引用中捕获从点到结尾的匹配,该反向引用也用于替换(那是</code>)。第二个应用于任何剩余的文件名,因为中间有 <code>t 命令。

结果可能需要通过管道传输到 sort -u 以删除任何重复项。

如果您没有文件名列表,可以使用 find 输入列表。

find . -type f | sed ... | sort -u