[英]reducing commands with 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 |
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\(.*\)%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 \
| sed 's|^/backup/daily\.1\(.*\)$|\0 \1|' \
| ( while read origin dest; do cp "$origin" "$dest"; done)
在sed
表達式中:
\\0
被替換為匹配的字符串,這是整個行的情況 \\1
由子模式匹配\\(.*\\)
替換,即從/ /backup/daily.1
之后到行尾的所有內容
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.