• Linux Shell脚本:从文件中读取文件路径并以相同目录结构复制到当前目录


    前言

    显然这个脚本的作用,是将指定的文件提取到当前目录中,并保持它原本的目录结构

    比如,我想把系统中lftp的所有文件按原本的目录结构复制出来。。

    你可能会疑问,为什么不直接从deb包中提取,比如这样:

    1. apt download lftp #从仓库中下载lftp的deb包,假设这里下载好的文件名是lftp.deb
    2. dpkg -X lftp.deb lftp #将lftp.deb文件解压

    这确实是个好方法!

    可如果只有文件列表,deb包下不到呢?

    又或者,系统中的某些文件是被修改过的,和仓库下载解包的不同呢?

    当然,可能还有其它情况。。

    做这个脚本,正是因为我在研究某个软件时,有它的文件列表却下不到它的包。。

    这里以lftp的文件列表做演示。

    创建两个文件,如图:

    文件列表.txt 中的内容如下:

    1. /usr/share/doc/lftp/README.debug-levels
    2. /usr/share/doc/lftp/README.gz
    3. /usr/share/doc/lftp/README.modules
    4. /usr/share/doc/lftp/changelog.Debian.gz
    5. /usr/share/doc/lftp/changelog.gz
    6. /usr/share/icons/hicolor/48x48/apps/lftp-icon.png
    7. /usr/share/man/man1/lftp.1.gz
    8. /etc/lftp.conf
    9. /usr/share/man/man5/lftp.conf.5.gz
    10. /usr/share/applications/lftp.desktop
    11. /usr/share/locale/zh_CN/LC_MESSAGES/lftp.mo
    12. /usr/share/locale/es/LC_MESSAGES/lftp.mo
    13. /usr/share/locale/zh_HK/LC_MESSAGES/lftp.mo
    14. /usr/share/locale/zh_TW/LC_MESSAGES/lftp.mo
    15. /usr/share/locale/it/LC_MESSAGES/lftp.mo
    16. /usr/share/locale/cs/LC_MESSAGES/lftp.mo
    17. /usr/share/locale/ja/LC_MESSAGES/lftp.mo
    18. /usr/share/locale/ru/LC_MESSAGES/lftp.mo
    19. /usr/share/locale/de/LC_MESSAGES/lftp.mo
    20. /usr/share/locale/pt_BR/LC_MESSAGES/lftp.mo
    21. /usr/share/locale/fr/LC_MESSAGES/lftp.mo
    22. /usr/share/locale/ko/LC_MESSAGES/lftp.mo
    23. /usr/share/locale/pl/LC_MESSAGES/lftp.mo
    24. /usr/share/locale/uk/LC_MESSAGES/lftp.mo
    25. /usr/share/man/man1/lftpget.1.gz

    提取文件.sh 的脚本内容:

    1. #!/bin/bash
    2. file="文件列表.txt"
    3. if [ ! -e $file ];then
    4. echo $file '不存在,脚本无法继续!'
    5. exit
    6. fi
    7. echo '请输入登陆密码:'
    8. read passwd
    9. echo $passwd |sudo -S echo
    10. if [ $? != 0 ];then
    11. echo "执行失败,可能是密码错误!"
    12. exit
    13. fi
    14. #从列表文件中提取所有路径,并在当前文件夹下创建
    15. cat $file |awk -F/ '{
    16. for ( i=1;i
    17. if (i == 1){
    18. sky = "." $i; #第一次循环加上 .
    19. }else{
    20. sky = sky "/" $i;
    21. }
    22. }
    23. print sky; #输出路径
    24. sky=""; #初始化路径,准备下一次循环
    25. }'|xargs mkdir -p
    26. #将列表中的文件,拷贝到当前文件夹下的对应目录中
    27. cat $file |awk '{
    28. system("sudo cp "$1" ."$1" ")
    29. }'

    因为是自用的脚本,里面的变量命名很随意,比如sky。。懒得修改,请自行修改。。

    执行脚本

    在文件夹空白处点击右键,选择“在终端中打开”:

     在弹出的终端窗口中输入:

    bash 提取文件.sh

     回车后,输入当前系统登陆的用户密码,正确的话所有的文件就拷贝过来了:

  • 相关阅读:
    如何使用Jmeter进行http接口测试?
    Numpy数组中的维度和轴
    【Matlab】曲线拟合
    数组:2.近序数组
    Python学习笔记(04)
    智慧城市标准化白皮书(2022版)发布
    PE文件-C++-SetCurrentDirectory当前工作文件夹编辑-GetCommandLine函数获取当前命令行参数
    巧用Jmeter Debug sampler获取变量信息
    16.Xaml WrapPanel控件 ---> 流面板
    Waymo dataset+mmdet3d的坐标系问题
  • 原文地址:https://blog.csdn.net/s806903/article/details/126918329