Eu gostaria de criar um nome de diretório para cada mês. Eu sei, depois de algumas brincadeiras com o shell, que:
date -d 1/01 +%b # Gives Jan
date -d 2/01 +%b # Gives Feb
.
date -d 12/01 +%b # Gives Dec
Então, eu usei a expansão de chaves echo {1..12}/01
e tentei xargs
:
echo {1..12}/01 | xargs -n 1 -I {} date -d {} +%b
Mas falha miseravelmente: / (depois eu gostaria de me inscrever mkdir
). Como posso fazer isso?
shell-script
xargs
bash-expansion
JammingThebBits
fonte
fonte
ls
ed em ordem alfabética (abril, agosto, dezembro, fevereiro, janeiro, julho, junho, março, maio, novembro, outubro e setembro).mkdir january february [...]
? A menos que você realmente precise criá-los separadamente, não há necessidade de fazê-lo da maneira sugerida.Respostas:
Com
-I
,xargs
obtém um argumento por linha em oposição ao padrão de um argumento por palavra (em branco ou em nova linha, possivelmente entre aspas) palavra sem-I
(e implica-n
). Portanto, no seu exemplo,date
é chamado apenas uma vez com{}
expandido para toda a saída deecho
(que está em uma linha), menos a nova linha à direita.Aqui você pode fazer (observe que essa
-d
é uma extensão GNU):(observe que ele não funcionará corretamente em locais onde as abreviações do nome do mês contenham espaços ou caracteres de aspas; com o GNU
xargs
, você pode contornar isso usandoxargs -d '\n' mkdir --
)Agora, para obter a lista de abreviações do mês em seu código do idioma, consultar o código do idioma diretamente faria mais sentido:
(veja também
locale -k LC_TIME
para ver todos os dados de localidade naLC_TIME
categoria).Ou nativamente em
zsh
:Pelo menos nos sistemas GNU, em alguns locais, as abreviações do mês são preenchidas com largura fixa com espaços:
Você pode remover esse preenchimento.
Os espaços à frente seriam removidos por
xargs -I
, mas não os à direita. Comzsh
:fonte
locale abmon
.IFS=';'; set -o noglob; mkdir -- $(locale abmon)
. ;)Tente um loop?
Se você deseja criar um diretório para cada mês, eu faria algo como:
fonte
{1..12}
é um basismo. Para um shell POSIX, o usofor m in $(seq 1 12)...
(embora note queseq
em si não é obrigatória por POSIX){1..12}
é um zshism, copiado posteriormente por ksh93, bash e várias outras conchas.Nos shells com expansão de chave e na data de aceitação da entrada DATAFILE, tente
e encha a concha se estiver satisfeito com o resultado.
fonte
Seu comando não funciona, devido ao uso de
-I
alterações no delimitador de xargs:Você pode adicionar
-d " "
ao xargs para fazê-lo funcionar. Mas você nem precisa-I{}
no seu caso:Tente isso,
fonte
date
aceitar opções após argumentos não opcionais como esse, não deve haver umaPOSIXLY_CORRECT
variável no ambiente.Você está tão perto.
O problema é que o eco está produzindo uma única linha
1/01 2/01 3/01 4/01 5/01 6/01 7/01 8/01 9/01 10/01 11/01 12/01
e o xargs está usando o caractere de nova linha como separador de campos (não o espaço).A solução: diga eco para colocar um espaço entre cada campo.
echo -e {1..12}/01\\n | xargs -n 1 -I {} date -d {} +%b
Eu apenas inseri
\\n
no final do eco.Então, para fazer os diretórios adicionarem
|xargs mkdir
por exemplo
echo -e {1..12}/01\\n | xargs -n 1 -I {} date -d {} +%b | xargs mkdir
fonte
A maneira mais simples e robusta de fazer isso:
Afinal, é uma lista estática de meses ...
Se você pretende usar o GNU
date
(assumindo um$IFS
GNU não modificado edate
semelhante ao seudate -d
):fonte