Busca e copia arquivos renomeando-os conforme a máscara
Publicado por Marcio Gil (última atualização em 16/09/2010)
[ Hits: 9.925 ]
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ã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
#!/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
Conversor de binário pra decimal e vice-versa
Configurar o Ubuntu para instalar drivers NVIDIA
Configuração Automática de Servidor de Arquivos
Nenhum comentário foi encontrado.
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Comandos no NixOS não funcionam (1)
De volta para o futuro - ou melhor, para o presente (24)