Categorize

From Essential
Jump to navigation Jump to search
== fix type 2 ==
find -type f |sed -rn 's#^(.*/|)([^/]*)\.([^\./]*[a-zA-Z]{2,}[^\./]*)[\.\-]([0-9TZtz_\.\-]{4,})$#\1;\2;\3;\4#p' |while IFS=';' read dirMy fileMy typeMy dateMy ;do mv -vn "${dirMy}${fileMy}.${typeMy}"?"${dateMy}" "${dirMy}${dateMy}-${fileMy}.${typeMy}" ;done
#== Categorize types ==
nbTypes=32
optionsMy= #update
find -empty -type d -delete
#all dirs
>/tmp/typeList$$
>/tmp/typeList$$.new
ls -a1 |grep -vE "^\.{,2}$" |while read lineMy ;do
  if [ -d "${lineMy}" ] ;then
#    echo "${lineMy}" ;done |while read lineMy ;do
    #check if type dir
    MyPatern='^.*\.([a-z0-9A-Z_]+)$'
    typeName="$(find "${lineMy}" -type f |head -1 |sed -rn "s#$MyPatern#\1#p")"
    if [ "${typeName}" == "${lineMy}" ] ;then
      echo "${typeName}" >>/tmp/typeList$$
    else
      echo "${lineMy}"
    fi
  else
    echo "${lineMy}"
  fi
done >/tmp/categorize$$.statNewTypes
[ "${optionsMy}" != "update" ] &&cat /tmp/categorize$$.statNewTypes |while read dirName2 ;do
    find "$dirName2" -type f |head -${nbTypes}
  done |head -1024 |while read MyFile ;do
    MyPatern='^.*[^/]+\.([a-z0-9A-Z]+)$'
    echo "$MyFile" |sed -rn "s#$MyPatern#\1#p" |head -1
#  done |sort |uniq -c |sort -gr |head -${nbTypes} |awk '{if ( $1 > 4 ) {$1="" ;print }}' |cut -c-1 --complement >>/tmp/typeList$$.new
  done |sort |uniq -c |sort -gr |head -${nbTypes} |awk '{$1="" ;print }' |cut -c-1 --complement >>/tmp/typeList$$.new
(cat /tmp/typeList$$ ;cat /tmp/typeList$$.new) |sort -u >/tmp/typeList$$2
mv -f /tmp/typeList$$2 /tmp/typeList$$
cat /tmp/typeList$$.new |while read MyType ;do
  mkdir "${MyType}" 2>/dev/null &&chown noname "${MyType}"
done
ls -a1 |grep -vE "^\.{,2}$" |grep -vw -f /tmp/typeList$$ >/tmp/dirList$$
cat /tmp/dirList$$ |while read lineMy ;do
  find "${lineMy}" -type f
done |while read MyFile ;do
  typeName=$(echo "${MyFile}" |sed -rn 's#^(.*)\.([^\.]*)|([^\.]+)$#\2#p')
  echo "${typeName}" |grep -E ^- ||(
  if [ ! -z "$(grep -x "${typeName}" /tmp/typeList$$)" ] ;then
    dirName="$(dirname "${MyFile}" )"
    mkdir -p "${typeName}/${dirName}" ||echo "${typeName}/${dirName}"
    chown --reference="${dirName}" "${typeName}/${dirName}"
    chmod --reference="${dirName}" "${typeName}/${dirName}"
    mv -vn "${MyFile}" "${typeName}/${MyFile}"
  fi
  )
done
find -type d -exec chown noname {} \;

== dir fix duplicate words ==
#directories
detox -r ./* ./\.[^\.]* ./\.\.?*
~/sh/caseFix.sh
find -xdev -empty -type d -delete
~/sh/remove-duplicate-words-dir.sh

#=== Rename orphans files ===
~/sh/caseFix.sh
find -xdev -type l -delete
find -xdev -empty -delete
~/sh/rename-orphans-files.sh
find -xdev -empty -delete
find -xdev -type d -exec chown noname {} \;

== metadata fix duplicate words ==
#directories
detox -r ./* ./\.[^\.]* ./\.\.?*
~/sh/caseFix.sh
find -xdev -empty -type d -delete
~/sh/remove-duplicate-words-dir.sh

#files
find ./* ./\.[^\.]* ./\.\.?* -xdev -type f |while read My ;do
  oldName=$(basename "${My}" |sed -rn 's#^(.*)\.([^\.]*)|([^\.]+)$#\1\3#p')
  typeName=$(basename "${My}" |sed -rn 's#^(.*)\.([^\.]*)|([^\.]+)$#\2#p')

  dirName="$(dirname "$My")"

  # remove word from dir
  #echo "${oldName}" |tr '_, ' '-' >/tmp/newName$$
  echo "${oldName}" |tr '_, ' '-' >/tmp/newName$$
  (echo "${dirName}" |sed -r "s#[^[:alnum:]]#\n#gI" ;echo "${typeName}" )|grep . |sort -u |while read My2 ;do
    cat /tmp/newName$$ |sed -r "s#\b${My2}\b[^[:alnum:]]*##gI" >/tmp/newName$$2
    mv -f /tmp/newName$$2 /tmp/newName$$
  done

  #reverse
  cat /tmp/newName$$ |rev >/tmp/newName$$2
  mv -f /tmp/newName$$2 /tmp/newName$$
  # remove duplicates
  countMy=32
  while [ ! -z "$(cat /tmp/newName$$ |sed -r "s#[^[:alnum:]]#\n#gI" |tr '[:upper:]' '[:lower:]' |grep . |sort |uniq -c |awk '{if ($1>1) print $2}' |tee /tmp/duplicatesWords$$)" ] ;do
    cat /tmp/duplicatesWords$$ |while read My2 ;do
      cat /tmp/newName$$ |sed -r "s#[^[:alnum:]]*\b${My2}\b##I" >/tmp/newName$$2
      mv -f /tmp/newName$$2 /tmp/newName$$
    done
    countMy=$((countMy-1)) && [ $countMy -le 0 ] &&break
  done

  #newName=$(cat /tmp/newName$$ |rev |sed -r 's#\.+#\.#g' |sed -r 's#\-+#-#g' |sed -r 's#\.\-#-#g' |sed -r 's#\-\.#-#g' |sed -r 's#\-+$##' |sed -r 's#\.+$##' |sed -r 's#^\-+##' |sed -r 's#^\.+##')
  newName=$(cat /tmp/newName$$ |rev |sed -r 's#[-\.]+$##' |sed -r 's#^[-\.]+##' |sed -r 's#[-\.]{2,}#-#g')
  newType="${typeName}"
  if [ ! -z "${typeName}" ] ;then
    typeName=".${typeName}"
    newType="$(echo $typeName |tr '[:upper:]' '[:lower:]')"
  fi
  [ "${oldName}${typeName}" != "${newName}${newType}" ] &&mv -vn "${dirName}/${oldName}${typeName}" "${dirName}/${newName}${newType}"
done




== classificate by small word ==
word1=Luc
[ ! -d "${word1}" ] &&mkdir "${word1}" &&chown noname "${word1}"
find -type d -iname "*${word1}*" |grep -vE "^\.{,2}$" |grep -vE "^\./${word1}$" |grep -iE '\b'"${word1}"'\b' |while read lineMy ;do
  echo "== ${lineMy} =="
  newPath="${word1}/$(echo ${lineMy} |sed -r 's#\b'"${word1}"'\b##gI')"
  newDir="$(dirname "${newPath}")"

  if [ -d "${newPath}" ] ;then
    mv -vn "${lineMy}"/* "${lineMy}"/\.[^\.]* "${lineMy}"/\.\.?* "${newPath}"/.
    rmdir "${lineMy}"
  else
    [ ! -d "${newDir}" ] &&mkdir -p "${newDir}" &&chown noname "${newDir}"
    mv -vn "${lineMy}" "${newPath}"
  fi
done
find -type f -iname "*${word1}*" |grep -vE "^\./${word1}/" |grep -iE '\b'"${word1}"'\b' |while read lineMy ;do
  echo "== ${lineMy} =="
  newPath="${word1}/$(echo ${lineMy} |sed -r 's#\b'"${word1}"'\b##gI')"
  newDir="$(dirname "${newPath}")"

  if [ ! -f "${newPath}" ] ;then
    [ ! -d "${newDir}" ] &&mkdir -p "${newDir}" &&chown noname "${newDir}"
    mv -vn "${lineMy}" "${newPath}"
  fi
done
find -empty -type d -delete
find "${word1}" -type d -exec chown noname {} \;

== classificate by word (5 or more letters) ==
word1=archive
[ ! -d "${word1}" ] &&mkdir "${word1}" &&chown noname "${word1}"
find -xdev -type d -iname "*${word1}*" |grep -vE "^\.{,2}$" |grep -vE "^\./${word1}$" |while read lineMy ;do
  echo "== ${lineMy} =="
  newPath="${word1}/$(echo ${lineMy} |sed 's#'"${word1}"'##gI')"
  newDir="$(dirname "${newPath}")"

  if [ -d "${newPath}" ] ;then
    mv -vn "${lineMy}"/* "${lineMy}"/\.[^\.]* "${lineMy}"/\.\.?* "${newPath}"/.
    rmdir "${lineMy}"
  else
    [ ! -d "${newDir}" ] &&mkdir -p "${newDir}" &&chown noname "${newDir}"
    mv -vn "${lineMy}" "${newPath}"
  fi
done
find -xdev -type f -iname "*${word1}*" |grep -vE "^\.{,2}$" |grep -vE "^\./${word1}/" |while read lineMy ;do
  echo "== ${lineMy} =="
  newPath="${word1}/$(echo ${lineMy} |sed 's#'"${word1}"'##gI')"
  newDir="$(dirname "${newPath}")"

  if [ ! -f "${newPath}" ] ;then
    [ ! -d "${newDir}" ] &&mkdir -p "${newDir}" &&chown noname "${newDir}"
    mv -vn "${lineMy}" "${newPath}"
  fi
done
find -xdev -empty -type d -delete
find "${word1}" -type d -exec chown noname {} \;