Como fazer com que os xargs manipulem espaços e caracteres especiais do cat?

6

Eu tenho um file que contém uma lista de nomes. ou seja:

Long Name One (001)
Long Name Two (201)
Long Name Three (123)
...

com espaços e alguns caracteres especiais. Eu queria criar diretórios desses nomes, por exemplo:

cat file | xargs -l1 mkdir

Faz diretórios individuais separados por espaços, ou seja, Long , Name , One , Two , Three , em vez de Long Name One (001) , Long Name Two (201) , Long Name Three (123) .

Como posso fazer isso?

    
por Majal 20.01.2016 / 14:07

4 respostas

9

Use -d '\n' com o comando xargs :

cat file | xargs -d '\n' -l1 mkdir

Da página de manual:

-d delim
              Input  items  are  terminated  by the specified character.  Quotes and backslash are not special; every
              character in the input is taken literally.  Disables the end-of-file string, which is treated like  any
              other  argument.   This can be used when the input consists of simply newline-separated items, although
              it is almost always better to design your program to use --null where this is possible.  The  specified
              delimiter  may be a single character, a C-style character escape such as \n, or an octal or hexadecimal
              escape code.  Octal and hexadecimal escape codes are understood as for the printf command.    Multibyte
              characters are not supported.

Exemplo de saída:

$ ls
file

$ cat file
Long Name One (001)
Long Name Two (201)
Long Name Three (123)

$ cat file | xargs -d '\n' -l1 mkdir

$ ls -1
file
Long Name One (001)
Long Name Three (123)
Long Name Two (201)
    
por 20.01.2016 / 14:46
6

Se sua implementação xargs suportar -0 option:

tr '\n' '
while IFS= read -r file; do
  mkdir -p -- "$file"
done <file
' <file | xargs -0 -l1 mkdir

POSIXly:

tr '\n' '
while IFS= read -r file; do
  mkdir -p -- "$file"
done <file
' <file | xargs -0 -l1 mkdir

(Observe que usar while loop para processar texto é considerado uma prática ruim no shell script)

    
por 20.01.2016 / 14:11
1

Faça os nomes nulos terminados e divididos:

cat file | tr '\n' '
cat file | tr '\n' '%pre%' | xargs -l1 -0 mkdir
' | xargs -l1 -0 mkdir

tr substituirá a nova linha que cat produz com -0 , e os xargs sinalizadores em %code% estão dizendo para dividir os argumentos na %code% .

    
por 20.01.2016 / 14:29
0

Você pode fazer isso POSIXLY com a opção -I :

xargs -I % mkdir % < file

link

    
por 09.02.2018 / 20:40