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 com esses nomes, ou seja:
cat file | xargs -l1 mkdir
Faz directórios individuais separadas por espaços, isto é Long
, Name
, One
, Two
, Three
, em vez de Long Name One (001)
, Long Name Two (201)
, Long Name Three (123)
.
Como eu posso fazer isso?
shell
xargs
whitespace
Majal
fonte
fonte
-d
opção.Se sua
-0
opção de suporte à implementação do xargs :POSIXly:
(Observe que o uso de
while
loop para processar texto considerado uma má prática no shell script)fonte
mkdir
por diretório;mkdir
pode levar mais de um argumento.xargs
espera um formato de entrada muito especial em que os argumentos sejam delimitados por espaços em branco ou novas linhas (às vezes outras formas de espaço em branco vertical, às vezes dependentes da localidade atual) e onde aspas simples, aspas duplas e barra invertida podem ser usadas para evitá-las (mas de uma maneira diferente caminho de aspas shell).-l1
não é passar uma linha de entrada como um único argumento paramkdir
, mas chamar umamkdir
chamada para cada linha de entrada, mas com palavras nessa linha ainda separadas por argumentos diferentes paramkdir
.A implementação do GNU
xargs
adicionou uma-0
opção décadas atrás para aceitar dados delimitados por NUL. Essa é a maneira mais óbvia de separar palavras que acabarão sendo argumentos para um comando, porque o caractere NUL passa a ser o único caractere que não pode ocorrer em um argumento de comando ou nome de arquivo (o formato de lista escolhido que coloca um arquivo por linha não pode representar todos os nomes de arquivos possíveis, pois não permite uma nova linha em um nome de arquivo).Isso
-0
foi copiado por várias outrasxargs
implementações, mas não por todas.Com aqueles que você pode fazer:
Isso chamará o menor
mkdir
número de vezes possível com o maior número de argumentos possível.Mas observe que, se
file
estiver vazio,mkdir
ainda será executado e você receberá um erro de sintaxemkdir
devido ao argumento ausente. O GNUxargs
adicionou uma-r
opção para o que foi copiado por algumas outras implementações.O GNU
xargs
também adicionou (mais tarde) uma-d
opção para poder especificar delimitadores arbitrários, mas acho que nenhuma outra implementação o copiou. Com o GNUxargs
, a melhor maneira é:Ao passar o arquivo com
-a
(também uma extensão GNU) em vez de stdin, isso significa quemkdir
o stdin é preservado.POSIX, você precisaria pós-processar a entrada para colocá-la no formato esperado por
xargs
. Você poderia fazê-lo, por exemplo, com:Onde colocar cada linha dentro de aspas e escapar cada
"
como"\""
antes de alimentar a xargs.Mas cuidado com as possíveis limitações:
sed
) se o conteúdo defile
não for um texto válido no código do idioma atual. Sefile
contiver nomes de arquivos codificados em mais de um conjunto de caracteres diferente, ou um conjunto de caracteres diferente daquele do código de idioma, será possível corrigir o código de idioma em C, o que deve ajudar.xargs
implementações têm limites ridiculamente baixos no tamanho máximo de um argumento (pode ser tão baixo quanto 255 bytes).Para contornar o erro de sintaxe após um erro de entrada vazio , você pode escrever:
fonte
Torne os nomes nulos terminados e divida lá:
tr
substituirá a nova linhacat
com a saída\0
e os-0
sinalizadores inxargs
estão dizendo para ele dividir argumentos no\0
.fonte
Você pode fazer isso POSIXLY com a
-I
opção:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/xargs.html
fonte