Eu tenho um script bash para implantar código de um ambiente beta para um ambiente de produção, mas atualmente tenho que adicionar a lista de arquivos a um arquivo txt manualmente e, em algum momento, sinto falta de alguns. Basicamente, meu script de implantação cat / loops copia os arquivos. (db de exportações / importações também, mas isso não é relevante .. lol)
De qualquer forma, eu gostaria de usar o find
comando para gerar uma lista de arquivos modificados nos últimos 14 dias. O problema é que preciso remover o caminho ./
para que o script de implantação funcione.
Aqui está um exemplo do uso do comando find:
encontrar . -type f -mtime -14> deploy.txt
Aqui está a linha que os gatos deploy.txt
no meu script de implantação:
for i in `cat deploy.txt`; do cp -i /home/user/beta/public_html/$i /home/user/public_html/$i; done
Alguma idéia de como fazer isso usando o script bash?
Obrigado!
--dry-run
modo e envie isso para um arquivo para revisão?Respostas:
Você pode usar a
-printf
opção de linha de comando com%f
para imprimir apenas o nome do arquivo sem nenhuma informação de diretórioou você pode usar o sed para remover o ./
fonte
/.
.|
como delimitador.%f
removerá todos os diretórios, não apenas./
. Isso interromperá o script de implantação se algum dos arquivos retornados porfind
estiver localizado em subdiretórios..
. E talvez seja melhor usar uma âncora de início de linha:s|^\./||
%P
vez de%f
. Isso apenas cortou o caminho indicado na linha de comando.O
./
deve ser inofensivo. A maioria dos programas tratará/foo/bar
e/foo/./bar
como equivalente. Sei que não parece muito bom, mas com base no que você postou, não vejo razão para que o script falhe.Se você realmente quer tirá-lo,
sed
é provavelmente a maneira mais limpa:Se você estiver em um sistema com o GNU find (por exemplo, a maioria dos sistemas Linux), poderá fazê-lo de uma só vez com
find -printf
:Os
%P
retornos o caminho completo de cada arquivo encontrado, menos o caminho especificado na linha de comando, até e incluindo a primeira barra. Isso preservará todos os subdiretórios em sua estrutura de diretórios.fonte
./
prefixo é realmente um recurso; sem ele, a saída da tubulação para outros comandos não funcionará corretamente, por exemplo, para nomes de arquivos que começam com um traço.Por que você precisa retirar o
./
? É válido ter um caminho. tãoestá tudo bem!
Mas se você deseja remover o nome do diretório em find, você pode usar o
%P
arg para-printf
.homem encontrar (1) diz:
Um exemplo
Mente a primeira linha vazia! Se você quiser evitá-lo, use
-mindepth 1
fonte
Bem, você tem algumas opções. Você pode usar a
-printf
opção find para imprimir apenas o nome do arquivo, ou pode usar uma ferramenta como sed para simplesmente remover o arquivo./
.fonte
A solução "find -printf" não funcionará no FreeBSD porque o find não possui essa opção. Nesse caso, o AWK pode ajudar. Ele retorna um sobrenome ($ NF), para que possa funcionar em qualquer profundidade.
PS: extraído do livro "Programação de shell Linux e Unix" de D.Tansley
fonte
Uma solução rápida, se eu entendi corretamente a pergunta, está usando
cut
a saída dofind
comando:Isso removerá os primeiros caracteres de cada linha do resultado (no seu caso
./
). Provavelmente não é a melhor solução, mas funciona no seu cenário.fonte
sed
é perfeito para esse tipo de coisa.fonte
Não sei de que tipo de nome de arquivo estamos falando, mas qualquer coisa com espaços ou novas linhas coloca a maioria das soluções aqui em risco.
Minha sugestão seria usar a expansão de parâmetros do shell para remover os caracteres de cada nome de arquivo:
Se você realmente gosta de pipes, pode usar um delimitador "seguro", como um nulo, com xargs para receber cada nome de arquivo:
Lembre-se de que a saída disso NÃO é delimitada por nulo; portanto, embora possa ser suficiente para uma verificação ocular, nenhuma dessas soluções produz um arquivo deploy.txt que é seguro para uso em automação, a menos que você tenha muita confiança em sua fonte nomes de arquivos.
fonte