Um pouco atrasado para a festa.
Eu uso o formato abaixo para compactar meus diretórios com milhares de pequenos arquivos antes de migrar. Se você não precisar de aspas simples dentro de comandos, deve funcionar.
Com algumas modificações, tenho certeza de que será útil para alguém. Testado em Cygwin
(babun)
find . -maxdepth 1 ! -path . -type d -print0 | xargs -0 -I @@ bash -c '{ tar caf "@@.tar.lzop" "@@" && echo Completed compressing directory "@@" ; }'
find .
Encontre aqui
-maxdepth 1
Não entre em diretórios filhos
! -path .
Excluir. / O caminho do diretório atual
-type d
corresponde apenas aos diretórios
-print0
Separe a saída por bytes nulos \ 0
| xargs
Canalizar para xargs A
-0
entrada é bytes separados por nulo O espaço
-I @@
reservado é @@. Substitua @@ pela entrada. Comando
bash -c '...'
Run Bash
{...}
Agrupamento de comandos
&&
Executar o próximo comando apenas se o comando anterior tiver sido encerrado com êxito (saída 0)
Final ;
é importante, caso contrário, falhará.
Resultado:
Completed compressing directory ./Directory1 with meta characters in it
Completed compressing directory ./Directory2 with meta characters in it
Completed compressing directory ./Directory3 with meta characters in it
Atualização de julho de 2018:
Se você gosta de hacks e brincadeiras, aqui está algo interessante:
echo "a b c" > a.txt
echo "123" >> a.txt
echo "###this is a comment" >> a.txt
cat a.txt
myCommandWithDifferentQuotes=$(cat <<'EOF'
echo "command 1: $@"; echo 'will you do the fandango?'; echo "command 2: $@"; echo
EOF
)
< a.txt xargs -I @@ bash -c "$myCommandWithDifferentQuotes" -- @@
Resultado:
command 1: a b c
will you do the fandango?
command 2: a b c
command 1: 123
will you do the fandango?
command 2: 123
command 1: ###this is a comment
will you do the fandango?
command 2: ###this is a comment
Explicação:
- Crie um script de liner único e armazene-o em uma variável
- xargs
leia a.txt
e execute-o como bash
script
- @@
garanta que toda vez que uma linha inteira seja passada
- Colocar @@
após --
garanta que @@
seja tomado como entrada de parâmetro posicional para o bash
comando, não um bash
início OPTION
, ou seja, como -c
ele, o que significarun command
--
é mágico, funciona com muitas outras coisas, ou seja ssh
, atékubectl