Busca e copia arquivos renomeando-os conforme a máscara
Publicado por Marcio Gil (última atualização em 16/09/2010)
[ Hits: 9.888 ]
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
Inclusão/Exclusão de usuários no CVS.
Instalador dos Drivers da NVIDIA para Debian
Instalação de pacotes em uma lista
Nenhum comentário foi encontrado.
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
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Flatpak: remover runtimes não usados e pacotes
Mudar o gerenciador de login (GDM para SDDM e vice-versa) - parte 2
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta