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)
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
[ 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
Carrega o VNC em uma tela do X11 separada e com mouse para canhotos
Compartilhamento de internet
Script de instalação do Squid 3 no Slackware
Subtitle DVD Multiplex
Album virtual para WEB
Comentários
| Nenhum comentário foi encontrado. |