Estoy buscando algo como:
ls | ask_yes_no_for_each_file | chmod +x the_files_approved
O sintaxis similar.
También podría funcionar en otros comandos para los que desea confirmación individual.
fuente
Estoy buscando algo como:
ls | ask_yes_no_for_each_file | chmod +x the_files_approved
O sintaxis similar.
También podría funcionar en otros comandos para los que desea confirmación individual.
Esto hace lo que estás buscando:
find . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x
Esto se utiliza en find
lugar de ls
porque, en general, la salida de análisis ls
no es confiable . Este formulario, find
sin embargo, funcionará con nombres de archivo incluso si contienen nuevas líneas u otros caracteres difíciles.
Explicación
find . -maxdepth 1 -type f -print0
Esto selecciona los archivos. Esto se puede personalizar utilizando cualquiera de las muchas opciones de búsqueda. La opción print0
le dice find
que imprima los nombres de los archivos en una lista separada por nulos. Este es el único confiable para transmitir listas de nombres de archivos.
xargs -L1 -p0 chmod +x
Esto toma la lista de nombres de archivos separados por nulos generados por find
y aplica su comando a ellos.
La -L1
opción le indica xargs
que trabaje solo con un nombre de archivo a la vez. La -p
opción le indica xargs
que solicite aprobación antes de continuar. La -0
opción le indica xargs
que use el carácter nulo como delimitador entre los nombres de archivo.
[No tenía conocimiento de la -p
opción xargs
hasta que @kwan lo señaló.]
find
comando POSIX sea compatible utilizando-exec printf '%s\0' {} +
. Sin embargo, no creo que haya alguna manera de hacer que todo sea compatible con POSIX.find: warning: you have specified the -maxdepth option after a non-option argument -type, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.
por lo que funciona con el-maxdepth 1
antes de que el-type f
, como:find . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x
.Puedes usar
xargs
.p.ej:
Opción
-p
: Pregunte al usuario si debe ejecutar cada línea de comando y leer una línea desde el terminal. Solo ejecute la línea de comando si la respuesta comienza con 'y' o 'Y'.fuente
xargs -p
que lo copiaré.ls
.touch "a very long file name
y presione enter. Vea la continuación de la línea y simplemente escriba la cotización de cierre y presione enter nuevamente. tadaa, nueva línea en el nombre del archivo. Por flojera para volver a escribir un nombre de archivo largo.