tazlito rev 361
tazlito: deduplicate symlinks
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Mon Oct 27 13:37:15 2014 +0100 (2014-10-27) |
parents | 0687ed780754 |
children | 69854038b08a |
files | tazlito |
line diff
1.1 --- a/tazlito Tue Aug 26 11:35:08 2014 +0200 1.2 +++ b/tazlito Mon Oct 27 13:37:15 2014 +0100 1.3 @@ -371,9 +371,9 @@ 1.4 # Deduplicate files (MUST be on the same filesystem). 1.5 deduplicate() 1.6 { 1.7 - find "$@" -type f -size +0c -xdev \ 1.8 + find "$@" -type f -xdev \ 1.9 -exec stat -c '%s-%a-%u-%g %i %h %n' {} \; | sort | \ 1.10 - ( save=0; old_attr=""; old_inode=""; old_link=""; old_file="" 1.11 + ( save=0; hardlinks=0; old_attr=""; old_inode=""; old_link=""; old_file="" 1.12 while read attr inode link file; do 1.13 [ -L "$file" ] && continue 1.14 if [ "$attr" = "$old_attr" -a "$inode" != "$old_inode" ]; then 1.15 @@ -382,6 +382,7 @@ 1.16 if ln "$old_file" "$file" 2> /dev/null; then 1.17 inode="$old_inode" 1.18 [ "$link" = "1" ] && 1.19 + hardlinks=$(($hardlinks+1)) && 1.20 save="$(($save+(${attr%%-*}+512)/1024))" 1.21 else 1.22 cp "$old_file" "$file" 1.23 @@ -390,7 +391,29 @@ 1.24 fi 1.25 old_attr="$attr" ; old_inode="$inode" ; old_file="$file" 1.26 done 1.27 - echo "$save Kbytes saved in duplicate files." 1.28 + echo "$save Kbytes saved in $hardlinks duplicate files." 1.29 + ) 1.30 + find "$@" -type l -xdev \ 1.31 + -exec stat -c '%s-%u-%g-TARGET- %i %h %n' {} \; | sort | \ 1.32 + ( old_attr=""; hardlinks=0; while read attr inode link file; do 1.33 + attr="${attr/-TARGET-/-$(readlink $file)}" 1.34 + if [ "$attr" = "$old_attr" ]; then 1.35 + if [ "$inode" != "$old_inode" ]; then 1.36 + rm -f "$file" 1.37 + if ln "$old_file" "$file" 2> /dev/null; then 1.38 + [ "$link" = "1" ] && 1.39 + hardlinks=$(($hardlinks+1)) 1.40 + else 1.41 + cp -a "$old_file" "$file" 1.42 + fi 1.43 + fi 1.44 + else 1.45 + old_file="$file" 1.46 + old_attr="$attr" 1.47 + old_inode="$inode" 1.48 + fi 1.49 + done 1.50 + echo "$hardlinks duplicate symlinks." 1.51 ) 1.52 } 1.53 1.54 @@ -408,7 +431,7 @@ 1.55 deduplicate . 1.56 1.57 # Use lzma if installed. Display rootfs size in realtime. 1.58 - rm -f /tmp/rootfs 1.59 + rm -f /tmp/rootfs 2> /dev/null 1.60 pack_rootfs . $DISTRO/$(basename $1).gz & 1.61 sleep 2 1.62 echo -en "\nFilesystem size:" 1.63 @@ -418,6 +441,7 @@ 1.64 echo -en "\\033[18G`du -sh $DISTRO/$(basename $1).gz | awk '{print $1}'` " 1.65 done 1.66 echo -e "\n" 1.67 + rm -f /tmp/rootfs 1.68 cd $DISTRO 1.69 mv $(basename $1).gz $ROOTCD/boot 1.70 } 1.71 @@ -1144,6 +1168,12 @@ 1.72 # Tazlito commands # 1.73 #################### 1.74 1.75 +case "$0" in 1.76 + *deduplicate) 1.77 + deduplicate "$@" 1.78 + exit 0 ;; 1.79 +esac 1.80 + 1.81 case "$COMMAND" in 1.82 stats) 1.83 # Tazlito general statistics from the config file. 1.84 @@ -2291,18 +2321,21 @@ 1.85 # Create list of files including default user files since it is defined in /etc/passwd 1.86 # and some new users might have been added. 1.87 cd / 1.88 - find bin etc init sbin var dev lib root usr home >/tmp/list 1.89 + for dir in bin etc init sbin var dev lib root usr home opt 1.90 + do 1.91 + [ -d $dir ] && find $dir 1.92 + done >/tmp/list 1.93 1.94 for dir in proc sys tmp mnt media media/cdrom media/flash \ 1.95 media/usbdisk run run/udev 1.96 do 1.97 - echo $dir >>/tmp/list 1.98 - done 1.99 + [ -d $dir ] && echo $dir 1.100 + done >>/tmp/list 1.101 sed -i '\/var\/run\/.*pid$/d' /tmp/list 1.102 1.103 # Generate initramfs with specified compression and display rootfs 1.104 # size in realtime. 1.105 - rm -f /tmp/rootfs 1.106 + rm -f /tmp/rootfs 2> /dev/null 1.107 write_initramfs & 1.108 sleep 2 1.109 cd - > /dev/null 1.110 @@ -2313,6 +2346,7 @@ 1.111 echo -en "\\033[18G`du -sh /rootfs.gz | awk '{print $1}'` " 1.112 done 1.113 echo -e "\n" 1.114 + rm -f /tmp/rootfs 1.115 1.116 # Move freshly generated rootfs to the cdrom. 1.117 mkdir -p $ROOTCD/boot