使用 sed 减少命令



我只是感兴趣是否可以将此命令减少到一行而不&&

find /backup/daily.1/var/www/ -iname "*.jpg" -type f >> ~/backuppath.txt
sed 's|/backup/daily.1||g' ~/backuppath.txt > ~/wwwpath.txt
paste -d " " ~/backuppath.txt ~/wwwpath.txt > ~/files.txt
while read line; do cp $line; done < ~/files.txt

我不会把它写在一行上,但你可以不用中间文件:

find /backup/daily.1/var/www/ -iname "*.jpg" -type f |
sed 's%/backup/daily.1(.*)%cp & 1%' |
sh -x

sed 命令将文件名拆分为两个部分,即 /backup/daily.1 前缀和"其余",并将其替换为将原始名称复制到不带前缀的名称的完整复制命令。 sed的输出作为脚本馈送到 shell。

这应该可以正常工作,除非文件名包含 shell 元字符、空格或换行符。 如果文件名中没有换行符或单引号,则可以通过以下方式提高复原能力:

find /backup/daily.1/var/www/ -iname "*.jpg" -type f |
sed "s%/backup/daily.1(.*)%cp '&' '1'%" |
sh -x

这会将每个文件名括在单引号中。

这不处理带空格的文件名。 (这不重要,我只是声明这一点以抢占不可避免的评论。

find /backup/daily.1/var/www/ -iname "*.jpg" -type f |
while read name; do cp $name ${name#/backup/daily.1}; done 

你也可以只做:

find /backup/daily.1/var/www/ -iname "*.jpg" 
    -type f -exec sh -c 'cp "$0" "${0#/backup/daily.1}"' {} ;

可以很好地处理不寻常的文件名。

find /backup/daily.1/var/www/ -iname "*.jpg" -type f 
 | sed 's|^/backup/daily.1(.*)$| 1|' 
 | ( while read origin dest; do cp "$origin" "$dest"; done)

sed表达式中:

  • 被匹配的字符串替换,这是整行
  • 的情况
  • 1被子形态匹配(.*)替换,即从/backup/daily.1之后到线尾的所有内容

相关内容

  • 没有找到相关文章

最新更新