Bash脚本:将父目录附加到文件名

时间:2012-06-04 12:19:23

标签: regex linux bash sed

如何将文件名的父目录普遍附加到文件名本身,例如

/home/username/Mirrors/earth.com/tree/apples/filename2.html
/home/username/Mirrors/earth.com/grass/flower/leave/filename1.html

稍后应该是这样命名的文件:

earth.com/tree/apples/filename2.html
earth.com/earth/grass/flower/leave/filename1.html

理想情况下,所有文件都位于一个文件夹中这可以用bash脚本和sed完成吗?

为什么我这样做:我用httrack镜像一个巨大的网站,httrack将文件保存在其相对目录结构中,我无法让httrack将文件保存为完整的URL。

4 个答案:

答案 0 :(得分:1)

由于您使用的是固定字段,因此可以使用大量工具。

$ sed 's#/home/username/Mirrors##' file
/earth.com/tree/apples/filename2.html
/earth.com/grass/flower/leave/filename1.html

$ cut -c24- file
earth.com/tree/apples/filename2.html
earth.com/grass/flower/leave/filename1.html

答案 1 :(得分:1)

您还没有定义要添加的父目录数。将其作为运行时参数,您可以使用以下awk命令:

echo /home/username/Mirrors/earth.com/tree/apples/filename2.html | 
awk  -F '/' -v D=3 '{for (i=D;i>=0;i--) {printf("%s", $(NF-i)); if (i>0) printf("/")}
 print "";}'

<强>输出

earth.com/tree/apples/filename2.html

答案 2 :(得分:0)

你的意思是

sed 's|^/home/username/Mirrors/||'

for f in /home/username/Mirrors/earth.com/*; do 
  mv $f `echo "$f" | sed 's|^/home/username/Mirrors/|/new/path/|'`;
done

答案 3 :(得分:0)

嗯,你可以使用sed,但httrack有能力,例如:

httrack http://earth.com/tree/apples/filename2.html -O /tmp/ -N100

根据文档:-N100 网站结构,没有www.domain.xxx /

但更多:

详细信息:选项N

  • N0网站结构(默认)
  • N1网络中的HTML /,web / images /中的图像/其他文件
  • N2网页/ HTML中的HTML,网页/图片中的图片/其他
  • N3 HTML / web /,images / other in web /
  • N4 HTML / web /,images / other in web / xxx,其中xxx是文件扩展名 (例如,所有gif将被放置在web / gif上)
  • N5图片/ web / xxx中的其他图片和web / HTML中的HTML
  • N99 web /中的所有文件,随机名称(小工具!)
  • N100网站结构,没有www.domain.xxx /
  • N101与N1相同,表示“网站”被网站名称取代
  • N102与N2相同,表示“网站”被网站名称取代
  • N103与N3相同,表示“网站”被网站名称取代
  • N104与N4相同,表示“网站”被网站名称取代
  • N105与N5相同,表示“网站”被网站名称取代
  • N199与N99相同,表示“网站”被网站名称取代
  • N1001与N1相同,表示没有“网络”目录
  • N1002与N2相同,表示没有“网络”目录
  • N1003与N3相同,表示没有“web”目录(为g选项设置选项)
  • N1004与N4相同,表示没有“网络”目录
  • N1005与N5相同,表示没有“网络”目录
  • N1099与N99相同,表示没有“网络”目录