我只是感兴趣是否可以将此命令减少到一行而不&&
?
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
表达式中: