Pular para o conteúdo

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

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/' \*.*~
Marcio Gil marciomgil
Hits: 10.342 Categoria: Shell Script Subcategoria: Miscelânea
  • Download
  • Nova versão
  • Indicar
  • Denunciar

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

Marcio Gil

Versão 2 enviada 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

Pesquisa Preços pela Internet

chwall.sh

Monitorar capacidade das partições

Sincronizando seu hosts.deny com blacklist online

Script para subir interface wireless

Nenhum comentário foi encontrado.

Contribuir com comentário

Entre na sua conta para comentar.