1

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

/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 get 将文件保存为完整的 URL。

4

4 回答 4

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
于 2012-06-04T12:32:03.253 回答
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
于 2012-06-04T12:36:24.640 回答
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
于 2012-06-04T12:31:46.453 回答
0

好吧,您可以使用sed,但httrack有能力,例如:

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

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

还有一点:

详细信息:选项 N

  • N0站点结构(默认)
  • N1web/ 中的 HTML,web/images/ 中的图像/其他文件
  • N2网页/HTML 中的 HTML,网页/图像中的图像/其他
  • N3web/ 中的 HTML,web/ 中的图像/其他
  • N4web/ 中的 HTML,web/xxx 中的 images/other,其中 xxx 是文件扩展名(例如,所有 gif 都将放在 web/gif 上)
  • N5web/xxx 中的图像/other 和 web/HTML 中的 HTML
  • N99web/ 中的所有文件,名称随机(小工具!)
  • N100站点结构,没有 www.domain.xxx/
  • N101与 N1 相同,只是将“web”替换为站点名称
  • N102与 N2 相同,只是将“web”替换为站点名称
  • N103与 N3 相同,只是将“web”替换为站点名称
  • N104与 N4 相同,只是将“web”替换为站点名称
  • N105与 N5 相同,只是将“web”替换为站点名称
  • N199与 N99 相同,只是将“web”替换为站点名称
  • N1001与 N1 相同,但没有“web”目录
  • N1002与 N2 相同,但没有“web”目录
  • N1003与 N3 相同,但没有“web”目录(为 g 选项设置的选项)
  • N1004与 N4 相同,但没有“web”目录
  • N1005与 N5 相同,但没有“web”目录
  • N1099与 N99 相同,但没有“web”目录
于 2012-06-04T12:40:37.100 回答