Linux slogan
Visite também: Segurança Linux · BR-Linux.org · Dicas-L · Doode · NoticiasLinux · SoftwareLivre.org · UnderLinux



» Screenshot
» Login
Login:
Senha:

Se você ainda não possui uma conta, clique aqui.

Esqueci minha senha



Scripts

Linux user

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

Login: marciomgil, 7680 pontos

   


Descrição

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/' \*.*~

[ Download: fcopy ]   [ Enviar nova versão ]

Versões atualizadas deste script (NOVO)
Linux user

Publicado 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

(versão 2)

 

[ 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
   Script Linux recomendado Carrega o VNC em uma tela do X11 separada e com mouse para canhotos
   Script Linux recomendado Compartilhamento de internet
   Script Linux recomendado Script de instalação do Squid 3 no Slackware
   Script Linux recomendado Subtitle DVD Multiplex
   Script Linux recomendado Album virtual para WEB

Comentários
Nenhum comentário foi encontrado.

Contribuir com comentário


  
Para executar esta ação você precisa estar logado no site, caso contrário, tudo o que for digitado será perdido.
Responsável pelo site: Fábio Berbert de Paula - Conteúdo distribuído sob licença GNU FDL
Site hospedado por:

Viva o Linux

A maior comunidade Linux da América Latina! Artigos, dicas, tutoriais, fórum, scripts e muito mais. Ideal para quem busca auto-ajuda em Linux.