usan - ¿Cómo usar el comodín.*En bash pero excluir el directorio padre(..)?
mover varios archivos en linux (6)
Dado que es posible que no desee establecer dotglob para el resto de su sesión de bash, puede configurarlo para un único conjunto de comandos ejecutando un subproceso como el siguiente:
$ (shopt -s dotglob; chmod g+w ./*)
A menudo, quiero ejecutar un comando en todos los archivos (incluidos los archivos ocultos) en un directorio. Cuando intento usar
chmod g+w * .*
cambia los permisos en todos los archivos que quiero (en el directorio) y en todos los archivos en el directorio principal (que quiero dejar solo).
¿Hay un comodín que haga lo correcto o debo comenzar a usar find?
Lo que hice fue
tar --directory my_directory --file my_directory.tar --create `ls -A mydirectory/`
Funciona bien el ls -A my_directory
expande a todo en el directorio excepto .
y ..
No hay globos extraños, y en una sola línea.
ps: Tal vez alguien me diga por qué esto no es una buena idea. :pag
Necesitará dos patrones globales para cubrir todos los posibles "archivos de puntos":. .[^.]*
Y ..?*
.
El primero hace coincidir todas las entradas de directorio con dos o más caracteres, donde el primer carácter es un punto y el segundo carácter no es un punto. El segundo recoge las entradas con tres o más caracteres que comienzan con ..
(esto excluye ..
porque solo tiene dos caracteres y comienza con un .
, Pero incluye entradas (improbables) como ..foo
).
chmod g+w .[^.]* ..?*
Esto debería funcionar bien en la mayoría de todos los shells y es adecuado para scripts.
Para uso interactivo regular, los patrones pueden ser demasiado difíciles de recordar. Para esos casos, su shell podría tener una forma más conveniente de omitir .
y ..
zsh siempre excluye .
y ..
partir de patrones como .*
. Con bash , tienes que usar la variable de shell GLOBIGNORE.
# bash
GLOBIGNORE=.:..
echo .*
Puede considerar configurar GLOBIGNORE en uno de sus archivos de personalización de bash (por ejemplo, .bash_profile
/ .bash_login
o .bashrc
). Sin embargo, tenga cuidado de acostumbrarse a esta personalización si utiliza con frecuencia otros entornos. Si ejecuta un comando como chmod g+w .*
En un entorno al que le falta su personalización, terminará incluyendo inesperadamente .
y ..
en su comando.
Además, puede configurar los shells para incluir "archivos de puntos" en patrones que no comienzan con un punto explícito (por ejemplo, *
).
# zsh
setopt glob_dots
# bash
shopt -s dotglob
# show all files, even “dot files”
echo *
Qué tal si:
shopt -s dotglob
chmod g+w ./*
Si está seguro de que nunca se utilizarán nombres de archivos ocultos de dos caracteres, entonces la opción más simple es simplemente hacer:
chmod g+w * ...*
Usualmente solo usaría . .[a-zA-Z0-9]*
. .[a-zA-Z0-9]*
ya que los nombres de mis archivos tienden a seguir ciertas reglas, pero eso no detectará todos los casos posibles.
Puedes usar:
chmod g+w $(ls -1a | grep -v ''^..$'')
que básicamente lista todos los archivos y directorios, elimina el directorio principal y luego procesa el resto. Tenga cuidado con los espacios en los nombres de archivos, sin embargo, los tratará como archivos separados.
Por supuesto, si solo quieres hacer archivos , puedes usar:
find . -maxdepth 0 -type f -exec chmod g+w {} '';''
o, otra solución más, que debería hacer todos los archivos y directorios excepto el ..
uno:
for i in * .* ; do if [[ ${i} != ".." ]] ; then chmod g+w "$i"; fi done
pero ahora estás entrando en un territorio donde los scripts o alias pueden ser necesarios.