簡體   English   中英

用sed減少命令

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM