sed 问题,求解答

2021-02-22 11:09:32 +08:00
 Usaki

假如现在我有一个文本,内容如下 /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 后面那部分都要,有什么好的方法吗

2085 次点击
所在节点    Linux
15 条回复
rrfeng
2021-02-22 11:14:43 +08:00
sed 's@/home/fdfs_storage/data/@/databak/@'
rrfeng
2021-02-22 11:15:37 +08:00
看起来要复制文件,直接 mv/cp/rsync 不好嘛

rsynv -a /home/fdfs_storage/data/ /databak/
Usaki
2021-02-22 11:15:49 +08:00
或者说怎么把内容替换成:
cp -r /home/fdfs_storage/data/1C/4B/wKgBc2ASh2OAbwzlAAXW0XxiphE875.jpg /databak/1C/4B/wKgBc2ASh2OAbwzlAAXW0XxiphE875.jpg
Usaki
2021-02-22 11:16:51 +08:00
@rrfeng 有六万多个图需要提取
Usaki
2021-02-22 11:21:34 +08:00
@rrfeng /home/fdfs_storage/data/1C/4B 下面是有很多图片的,我只需要其中几张,每个 /data/XX/XX 下面都有个别图片要提取
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
2021-02-22 11:53:16 +08:00
@axeprpr1 /data/XX/XX 这里的文件夹不是固定的哦
Usaki
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
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
2021-02-22 17:16:13 +08:00
其实实现起来也有其他简单的方法,cp 有个参数是带原始目录拷贝的,拷贝完了,再移到你要的目录并删除无用的目录即可

代码粘不上来,触发了 v2 的规则:创建新回复过程中遇到一些问题:
请不要在每一个回复中都包括外链,这看起来像是在 spamming
Usaki
2021-02-22 17:17:42 +08:00
@squarer 想不出来 我裂开了
不过学习了 谢谢了哈哈
Jirajine
2021-02-22 17:22:16 +08:00
其实有你发帖的时间用一个你擅长的脚本语言早就写完了。
squarer
2021-02-22 17:24:52 +08:00
cat 1.txt | sed 's#$# /databak/#;s/^/cp --p 删除我 arents /'
squarer
2021-02-22 17:27:02 +08:00
mkdir /databak
执行刚生成的脚本
mv /databak/home/fdfs_storage/data/* /databak
rm -R /databak/home
squarer
2021-02-22 17:30:03 +08:00
迷之判断规则,发好多次都不行

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/755019

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX