Tengo un fileque contiene una lista de nombres. es decir:
Long Name One (001)
Long Name Two (201)
Long Name Three (123)
...
con espacios y algunos personajes especiales. Quería hacer directorios con estos nombres, es decir:
cat file | xargs -l1 mkdir
Se hace directorios individuales separados por espacios, es decir Long, Name, One, Two, Three, en lugar de Long Name One (001), Long Name Two (201), Long Name Three (123).
¿Cómo puedo hacer eso?
shell
xargs
whitespace
Majal
fuente
fuente

-dopción.Si su
-0opción de soporte de implementación xargs :POSIXY:
(Tenga en cuenta que el uso del
whilebucle para procesar texto se considera una mala práctica en el script de shell)fuente
mkdirpor directorio,mkdirpuede tomar más de un argumento.xargsespera un formato de entrada muy especial donde los argumentos están delimitados por espacios en blanco o nuevas líneas (a veces otras formas de espacios en blanco verticales, a veces dependientes de la configuración regional actual), y donde se pueden usar comillas simples, comillas dobles y barras invertidas para escapar de ellas (pero en una forma diferente camino de las comillas).-l1no es pasar una línea de entrada como un solo argumentomkdir, sino llamar a unamkdirinvocación para cada línea de entrada, pero con palabras en esa línea aún separadas como argumentos diferentes paramkdir.La implementación de GNU
xargsagregó una-0opción hace décadas para aceptar entradas delimitadas por NUL. Esa es la forma más obvia de separar palabras que terminarán siendo argumentos para un comando porque el carácter NUL resulta ser el único carácter que no puede aparecer en un argumento de comando o nombre de archivo (el formato de lista elegido que coloca un archivo por línea no puede representar todos los nombres de archivo posibles ya que no permite una nueva línea en un nombre de archivo).Eso
-0ha sido copiado por varias otrasxargsimplementaciones, pero no todas.Con los que puedes hacer:
Eso requerirá la
mkdirmenor cantidad de veces posible con tantos argumentos como sea posible.Pero tenga en cuenta que si
fileestá vacío,mkdirtodavía se ejecutará y obtendrá un error de sintaxismkdirdebido al argumento que falta. GNUxargsagregó una-ropción para lo que ha sido copiado por algunas otras implementaciones.GNU
xargstambién agregó (más adelante) una-dopción para poder especificar delimitadores arbitrarios, pero no creo que ninguna otra implementación lo haya copiado. Con GNUxargs, la mejor manera es con:Al pasar el archivo con
-a(también una extensión GNU) en lugar de stdin, eso significa quemkdirse preserva el stdin.POSIXY, necesitaría postprocesar la entrada para ponerla en el formato esperado por
xargs. Podrías hacerlo por ejemplo con:Donde encerramos cada línea entre comillas dobles y escapamos de cada una
"como"\""antes de alimentar a xargs.Pero cuidado con las posibles limitaciones:
sed) si el contenido defileno es texto válido en la configuración regional actual. Sifilecontiene nombres de archivos que codifican en más de un conjunto de caracteres diferente, o un conjunto de caracteres diferente al de la configuración regional, puede corregir la configuración regional en C, lo que debería ayudar.xargsimplementaciones tienen límites ridículamente bajos en la longitud máxima de un argumento (puede ser tan bajo como 255 bytes).Para evitar el error de sintaxis en el error de entrada vacía , puede escribir:
fuente
Haga los nombres nulos terminados y divididos allí:
trreemplazará la nueva línea con la quecatsale\0, y las-0banderas enxargsle dicen que divida los argumentos en\0.fuente
Puede hacer esto POSIXLY con la
-Iopción:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/xargs.html
fuente