{"id":229,"date":"2021-04-03T17:06:00","date_gmt":"2021-04-03T17:06:00","guid":{"rendered":"http:\/\/jplatz.com.br\/syntax\/?p=229"},"modified":"2021-04-04T01:18:03","modified_gmt":"2021-04-04T01:18:03","slug":"shell-bash-remover-arquivos-selecionados-com-find-exec","status":"publish","type":"post","link":"https:\/\/jplatz.com.br\/syntax\/2021\/04\/03\/shell-bash-remover-arquivos-selecionados-com-find-exec\/","title":{"rendered":"SHELL Bash Remover Arquivos Selecionados com Find -exec"},"content":{"rendered":"\n<pre class=\"wp-block-code\"><code>find folder -type f -name '*.txt' -exec rm {} +<\/code><\/pre>\n\n\n\n<p>Para quem tem de lidar com arquivos f\u00edsicos em sua rotina di\u00e1ria eu tenho certeza de que em algum momento j\u00e1 precisou fazer um elimina\u00e7\u00e3o de determinados arquivos, arquivos estes misturados com outros milhares de arquivos, e ainda espalhados por diversos subdiret\u00f3rios que voc\u00ea nem sequer pudesse imaginar onde estariam.<\/p>\n\n\n\n<p>Bom, n\u00e3o \u00e9 mais a minha rotina, mas um dia j\u00e1 precisei fazer este tipo de limpeza antes de entregar um deploy; Eu precisei limpar arquivos que n\u00e3o faziam parte do codebase do sistema, arquivos tipo teste e upload&#8230; da\u00ed bateu aquele frio na espinha!<\/p>\n\n\n\n<p>Dei bastante sorte, numa r\u00e1pida pesquisa um desses caras legais que ficam escrevendo dicas na internet escreveu um artigo que resolvia exatamente o meu problema. Ent\u00e3o, explicando o comando acima:<\/p>\n\n\n\n<p>O comando <strong>find<\/strong> vai buscar no diret\u00f3rio <strong>folder<\/strong> todos os elementos do tipo arquivo <strong>-type f <\/strong>cujo nome fa\u00e7a match com a extens\u00e3o texto <strong>-name &#8216;*.txt&#8217;<\/strong> e mais que isso, a busca na verdade vai ser processada de forma recursiva descendo at\u00e9 o \u00faltimo n\u00edvel de diret\u00f3rio existente, j\u00e1 que um n\u00edvel m\u00e1ximo <strong>-maxdepth<\/strong> n\u00e3o foi estipulado.<\/p>\n\n\n\n<p>A remo\u00e7\u00e3o dos arquivos encontrados \u00e9 processada com a op\u00e7\u00e3o de executar <strong>-exec<\/strong> um comando shell <strong>rm<\/strong> para remo\u00e7\u00e3o. O sinal de mais <strong>+<\/strong> ao final do comando \u00e9 uma exig\u00eancia da sintaxe para esta constru\u00e7\u00e3o. <\/p>\n\n\n\n<p>A m\u00e1gica na verdade acontece nos brackets <strong>{}<\/strong> onde o mesmo \u00e9 substitu\u00eddo por todas as ocorr\u00eancias encontradas pelo comando find.<\/p>\n\n\n\n<p>Pronto, sua remo\u00e7\u00e3o foi processada de forma limpa e segura!<\/p>\n\n\n\n<p>Voc\u00ea poderia abusar ainda mais das op\u00e7\u00f5es de busca, no caso poderia informar as negativas, ou seja, apenas o conjunto de arquivos que n\u00e3o deseja remover.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>find folder -type f '!' -name '*.css' '!' -name '*.js' '!' -name '*.php' -exec rm {} +<\/code><\/pre>\n\n\n\n<p>Segue abaixo uma sketch para montar um ambiente de testes para exercitar os comandos e poder remover os arquivos com seguran\u00e7a.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir folder\nmkdir folder\/bkp\n\ntouch folder\/one.txt\ntouch folder\/two.txt\ntouch folder\/three.csv\ntouch folder\/four.txt\n\ncp folder\/*.* folder\/bkp\ntouch folder\/bkp\/six.txt <\/code><\/pre>\n\n\n\n<p>Aqui os comandos sem a remo\u00e7\u00e3o para voc\u00ea entender o comando find um pouco melhor. Tente variar as combina\u00e7\u00f5es de busca para ver o comportamento.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>find folder -type f -name '*.txt'\n\nfind folder -type f '!' -name '*.css' '!' -name '*.js' '!' -name '*.php'<\/code><\/pre>\n\n\n\n<p>Agora voc\u00ea j\u00e1 sabe, ao inv\u00e9s de tentar aquele comando cujo nome n\u00e3o pode ser pronunciado (<strong>rm -r<\/strong>), agora voc\u00ea conhece uma op\u00e7\u00e3o muito mais segura. Se n\u00e3o for us\u00e1-la, \u00e9 por sua conta e risco!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Para quem tem de lidar com arquivos f\u00edsicos em sua rotina di\u00e1ria eu tenho certeza de que em algum momento j\u00e1 precisou fazer um elimina\u00e7\u00e3o de determinados arquivos, arquivos estes misturados com outros milhares de arquivos, e ainda espalhados por diversos subdiret\u00f3rios que voc\u00ea nem sequer pudesse imaginar onde estariam. Bom, n\u00e3o \u00e9 mais a [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10,9,11],"tags":[114,115,116],"class_list":["post-229","post","type-post","status-publish","format-standard","hentry","category-command-line","category-linux","category-shell-script","tag-bash","tag-find","tag-rm"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts\/229","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/comments?post=229"}],"version-history":[{"count":2,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts\/229\/revisions"}],"predecessor-version":[{"id":236,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts\/229\/revisions\/236"}],"wp:attachment":[{"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/media?parent=229"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/categories?post=229"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/tags?post=229"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}