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

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

[ Hits: 9.776 ]

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

Alta disponibilidade IP-Virtual

getdnsrouter

Script para escrever uma palavra em ASCI

Download via FTP

Resolvendo NO_PUBKEY


  

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