Busca e copia arquivos renomeando-os conforme a máscara

Publicado por Marcio Gil (última atualização em 16/09/2010)

[ Hits: 9.762 ]

Download fcopy

Download 1283890030.fcopy (versão 2)




Busca e copia arquivos renomeando-os conforme a máscara.

Uso:

  fcopy [opções] [caminho1/]máscara1 [caminho2/]máscara2
  fcopy [opções] --sed 'expr' [caminho/]máscara

Opções:

  --test    Não efetua a cópia, apenas mostra o que será feito
  --cmd cp  Determina o comando para a cópia e zera as opções
  --sed exp Determina uma expressão "sed" no lugar de "máscara2"
  --recursive,
  -R,-r     Buscar arquivos no diretório e subdiretórios de origem
  -*        Outras opções são repassadas ao comando "cp" (-vbp implícito)

Exemplos:

  fcopy \*.*~ \*.bak
  fcopy '*.*~' '*.bak'
  fcopy "*.*~" "*.bak"
  fcopy --sed 's/\..*~$/.bak/' \*.*~

  



Versões atualizadas deste script

Versão 2 - Enviado por Marcio Gil em 07/09/2010

Changelog: - Sistema de construção de expressão melhorado
- Agora suporta os coringas *, ? e [...] na máscara de origem
- e os coringas *, ? e #n na máscara de destino
- Regras mais claras para a correspondência dos coringas das máscaras
- Opção -icase para ignorar maiúsculas ou minúsculas no nome dos arquivos

Download 1283890030.fcopy


Esconder código-fonte

#!/bin/bash
#
# fcopy: Busca e copia arquivos renomeando-os conforme a máscara
# Criado por: Marcio Gil Maldonado
#

cmd=`basename $0`

if [ "$1" == "--help" ] ; then
  echo "Busca e copia arquivos renomeando-os conforme a máscara"
  echo
  echo "Uso:"
  echo "  $cmd [opções] [caminho1/]máscara1 [caminho2/]máscara2"
  echo "  $cmd [opções] --sed 'expr' [caminho/]máscara"
  echo
  echo "Opções:"
  echo "  --test    Não efetua a cópia, apenas mostra o que será feito"
  echo "  --cmd cp  Determina o comando para a cópia e zera as opções"
  echo "  --sed exp Determina uma expressão \"sed\" no lugar de \"máscara2\""
  echo "  --recursive,"
  echo "  -R,-r     Buscar arquivos no diretório e subdiretórios de origem"
  echo "  -*        Outras opções são repassadas ao comando \"cp\" (-vbp implícito)"
  echo
  echo "Exemplos:"
  echo "  $cmd \\*.*~ \\*.bak"
  echo "  $cmd '*.*~' '*.bak'"
  echo "  $cmd \"*.*~\" \"*.bak\""
  echo "  $cmd --sed 's/\..*~$/.bak/' \\*.*~"
  echo
  exit 0
fi

# Tratamento dos parâmetros

istest="0"
cpcmd="cp"
cpopt="-vbp"
maxdepth_o="-maxdepth"
maxdepth_n="1"
sedexpr=""
oldname=""
newname=""

while [ $# -gt 0 ] ; do
  case "$1" in
    --test) istest="1" ;;
    --cmd)  cpcmd="$2" ; cpopt="" ; shift ;;
    --sed)  sedexpr="$2" ; shift ;;
    --recursive|-R|-r) maxdepth_o="" ; maxdepth_n="" ; cpopt="$cpopt $1" ;;
    -*)     cpopt="$cpopt $1" ;;
    *)
    if [ -z "$oldname" ] ; then
      oldname="$1"
    elif [ -z "$newname" -a -z "$sedexpr" ] ; then
      newname="$1"
    else
      echo "$cmd: Excesso de parâmetros: $1" >&2
      echo "$cmd: Execute '$cmd --help' para mais informações." >&2
      exit 1
    fi
  esac
  shift
done

if [ -z "$oldname" ] ; then
  echo "$cmd: Máscara de origem não informado" >&2
  echo "$cmd: Execute '$cmd --help' para mais informações." >&2
  exit 1
fi
if [ -z "$newname" -a -z "$sedexpr" ] ; then
  echo "$cmd: Máscara de destino não informado" >&2
  echo "$cmd: Execute '$cmd --help' para mais informações." >&2
  exit 1
fi

patt=`basename "$oldname"`
if [ "$oldname" == "$patt" ] ; then
  cpdir="."
else
  cpdir=`dirname "$oldname"`
  oldname="$patt"
fi

patt=`basename "$newname"`
if [ "$newname" == "$patt" ] ; then
  cpdst="$cpdir"
else
  cpdst=`dirname "$newname"`
  newname="$patt"
fi

# Montagem da expressão 'sed'

if [ -z "$sedexpr" ] ; then
  oldpatt=`echo -n "$oldname" | sed -e 's/[^*?]*\([*?]\?\)[^*?]*/\1/g'`
  newpatt=`echo -n "$newname" | sed -e 's/[^*?]*\([*?]\?\)[^*?]*/\1/g'`

  if [ "$newpatt" != "$oldpatt" ] ; then
    op=`echo -n "$oldpatt" | wc -m`
    np=`echo -n "$newpatt" | wc -m`
    if (( $op < $np || $np == 0 )) ; then
      echo "$cmd: As máscaras de origem e destino são incompatíveis" >&2
      echo "$cmd: Execute '$cmd --help' para mais informações." >&2
      exit 1
    fi
  fi

  oldpatt=`echo -n "$oldname" | sed -e 's/[.]/\\\\./g;s#/#\\\\/#g' \
                                    -e 's/[*]/\\\\(.*\\\\)/g;s/\([?]\)/\\\\(.\\\\)/g'`
  newpatt=`echo -n "$newname" | sed -e 's/[.]/\\./g;s#/#\\/#g'`

  np="1"
  while : ; do
    patt=`echo -n "$newpatt" | sed -e "s/[*?]/\\\\\\\\$np/"`
    if [ "$newpatt" == "$patt" ] ; then
      break
    fi
    newpatt="$patt"
    np=$(( $np + 1 ))
  done

  sedexpr="s/$oldpatt/$newpatt/"
fi

# Efetua/exibe as operações

if (( $istest )) ; then
  echo find "\"$cpdir\"" $maxdepth_o $maxdepth_n -name "\"$oldname\""
fi

IFS=$'\n'
for f in `find "$cpdir" $maxdepth_o $maxdepth_n -name "$oldname"` ; do
  g=`echo -n "$f" | sed "s#^$cpdir##" | sed "$sedexpr"`
  if (( $istest )) ; then
    echo "$cpcmd" $cpopt "\"$f\"" "\"$cpdst$g\""
  else
    "$cpcmd" $cpopt "$f" "$cpdst$g"
  fi
done

# End of fcopy

Scripts recomendados

Compartilhamento NAT

Montar imagens iSO em local especificado

matrix.sh (Wake up, neo...)

Instalando o Beryl no debian etch

Hora Certa


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts