V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
Usaki
V2EX  ›  Linux

sed 问题,求解答

  •  
  •   Usaki · 2021-02-22 11:09:32 +08:00 · 2117 次点击
    这是一个创建于 1397 天前的主题,其中的信息可能已经有所发展或是发生改变。

    假如现在我有一个文本,内容如下 /home/fdfs_storage/data/1C/4B/wKgBc2ASh2OAbwzlAAXW0XxiphE875.jpg /home/fdfs_storage/data/1C/4B/wKgBc2ASiF2AdqCtAAWrBVo-g9Y740.jpg /home/fdfs_storage/data/1C/4B/wKgBcmASiKCAZ5VIAAWWRheIptg999.jpg /home/fdfs_storage/data/1C/4B/wKgBcmASiLWAFFbOAAV4ojTPiZs627.jpg

    ...

    我想把这些文件提取,并且包括文件夹,比如把 /home/fdfs_storage/data/1C/4B/wKgBc2ASh2OAbwzlAAXW0XxiphE875.jpg 复制到 /databak/1C/4B/wKgBc2ASh2OAbwzlAAXW0XxiphE875.jpg 就是 data 后面那部分都要,有什么好的方法吗

    15 条回复    2021-02-22 17:30:03 +08:00
    rrfeng
        1
    rrfeng  
       2021-02-22 11:14:43 +08:00
    sed 's@/home/fdfs_storage/data/@/databak/@'
    rrfeng
        2
    rrfeng  
       2021-02-22 11:15:37 +08:00
    看起来要复制文件,直接 mv/cp/rsync 不好嘛

    rsynv -a /home/fdfs_storage/data/ /databak/
    Usaki
        3
    Usaki  
    OP
       2021-02-22 11:15:49 +08:00
    或者说怎么把内容替换成:
    cp -r /home/fdfs_storage/data/1C/4B/wKgBc2ASh2OAbwzlAAXW0XxiphE875.jpg /databak/1C/4B/wKgBc2ASh2OAbwzlAAXW0XxiphE875.jpg
    Usaki
        4
    Usaki  
    OP
       2021-02-22 11:16:51 +08:00
    @rrfeng 有六万多个图需要提取
    Usaki
        5
    Usaki  
    OP
       2021-02-22 11:21:34 +08:00
    @rrfeng /home/fdfs_storage/data/1C/4B 下面是有很多图片的,我只需要其中几张,每个 /data/XX/XX 下面都有个别图片要提取
    axeprpr1
        6
    axeprpr1  
       2021-02-22 11:23:44 +08:00
    ls /home/fdfs_storage/data/* | xargs -I {} echo cp -r /home/fdfs_storage/data/{} /databak/{}
    Usaki
        7
    Usaki  
    OP
       2021-02-22 11:53:16 +08:00
    @axeprpr1 /data/XX/XX 这里的文件夹不是固定的哦
    Usaki
        8
    Usaki  
    OP
       2021-02-22 14:38:51 +08:00
    #!/bin/bash

    TXT=`cat /home/fdfs_storage/1.txt`
    for FILE in $TXT;do
    A=`grep $FILE 1.txt | awk -F '/' '{print $4}'`
    B=`grep $FILE 1.txt | awk -F '/' '{print $5}'`
    C=`grep $FILE 1.txt | awk -F '/' '{print $6}'`
    mkdir -p /$A/$B/$C
    cp $FILE "/$A/$B/$C"
    done

    搞定了
    squarer
        9
    squarer  
       2021-02-22 16:22:33 +08:00
    不是说好的 sed 问题吗?那就用 sed 实现 [手动滑稽]
    你之前的需求,用 sed 实现的话就这样:
    cat 1.txt | sed 's#data.*#& /databak/&#;s#databak/data#databak#;s/^/cp -r /' > 2.txt

    但实际还需要创建目录所以应该这样:
    cat 1.txt | sed 's#.*data#/databak#;s#.*/#&+++#;s#+++.*##;s/^/mkdir -p /' > 2.sh
    cat 1.txt | sed 's#data.*#& /databak/&#;s#databak/data#databak#;s/^/cp -r /' >> 2.sh
    然后执行 2.sh 就能备份你的文件
    sh 2.sh
    squarer
        10
    squarer  
       2021-02-22 17:16:13 +08:00
    其实实现起来也有其他简单的方法,cp 有个参数是带原始目录拷贝的,拷贝完了,再移到你要的目录并删除无用的目录即可

    代码粘不上来,触发了 v2 的规则:创建新回复过程中遇到一些问题:
    请不要在每一个回复中都包括外链,这看起来像是在 spamming
    Usaki
        11
    Usaki  
    OP
       2021-02-22 17:17:42 +08:00
    @squarer 想不出来 我裂开了
    不过学习了 谢谢了哈哈
    Jirajine
        12
    Jirajine  
       2021-02-22 17:22:16 +08:00 via Android
    其实有你发帖的时间用一个你擅长的脚本语言早就写完了。
    squarer
        13
    squarer  
       2021-02-22 17:24:52 +08:00
    cat 1.txt | sed 's#$# /databak/#;s/^/cp --p 删除我 arents /'
    squarer
        14
    squarer  
       2021-02-22 17:27:02 +08:00
    mkdir /databak
    执行刚生成的脚本
    mv /databak/home/fdfs_storage/data/* /databak
    rm -R /databak/home
    squarer
        15
    squarer  
       2021-02-22 17:30:03 +08:00
    迷之判断规则,发好多次都不行
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1526 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 17:03 · PVG 01:03 · LAX 09:03 · JFK 12:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.