command-line – Excluir de * en la línea de comando

Pregunta:

Hay muchas situaciones en las que el uso de * es prácticamente inevitable, por ejemplo, rm -rf * en una carpeta que contiene miles de subcarpetas y archivos.

Pero, ¿qué sucede si desea excluir solo uno o dos archivos o carpetas del comando rm ? Busqué en Google y solo encontré soluciones bastante complicadas como find . -depth -not \( -name 'one' -o -name 'two' \ -o -name 'three' \) -exec rm {} \; como se indica aquí .

¿Existe la posibilidad de hacer esto de una manera más fácil, sin ese desvío para find ? Por ejemplo, rm -rf --exclude='one' --exclude='two' --exclude='three' * como en rsync o simplemente rm -rf -e 'one','two','three' * ?

¿Quizás incluso una posibilidad general de excluir cosas de * (para que otros comandos como cp , mv , … no tengan que implementar los suyos propios)? ¿Algo como *{'one','two','three'} o algo así?

Respuesta:

Para Bash, existe una opción de shell llamada extglob que está desactivada de forma predeterminada para mantener la compatibilidad con la sintaxis de shell estándar. Extglob complementa la sintaxis con operadores adicionales como !() ,? ?() , @() Y algunos más.

Para activar extglob , escriba shopt -s extglob . Para mantenerlo encendido para el usuario actual, escriba echo 'shopt -s extglob' >> ~/.bashrc .

Para el ejemplo de rm: con extglob puede usar

rm -rf !(one|two|three)

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım