Tengo un file
que 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
-d
opción.Si su
-0
opción de soporte de implementación xargs :POSIXY:
(Tenga en cuenta que el uso del
while
bucle para procesar texto se considera una mala práctica en el script de shell)fuente
mkdir
por directorio,mkdir
puede tomar más de un argumento.xargs
espera 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).-l1
no es pasar una línea de entrada como un solo argumentomkdir
, sino llamar a unamkdir
invocació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
xargs
agregó una-0
opció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
-0
ha sido copiado por varias otrasxargs
implementaciones, pero no todas.Con los que puedes hacer:
Eso requerirá la
mkdir
menor cantidad de veces posible con tantos argumentos como sea posible.Pero tenga en cuenta que si
file
está vacío,mkdir
todavía se ejecutará y obtendrá un error de sintaxismkdir
debido al argumento que falta. GNUxargs
agregó una-r
opción para lo que ha sido copiado por algunas otras implementaciones.GNU
xargs
también agregó (más adelante) una-d
opció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 quemkdir
se 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 defile
no es texto válido en la configuración regional actual. Sifile
contiene 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.xargs
implementaciones 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í:
tr
reemplazará la nueva línea con la quecat
sale\0
, y las-0
banderas enxargs
le dicen que divida los argumentos en\0
.fuente
Puede hacer esto POSIXLY con la
-I
opción:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/xargs.html
fuente