Eu sei como excluir todos os txtarquivos no diretório atual por rm *.txt. Alguém sabe como excluir todos os arquivos no txtarquivo EXCEPT do diretório atual ?
Eu sei como excluir todos os txtarquivos no diretório atual por rm *.txt. Alguém sabe como excluir todos os arquivos no txtarquivo EXCEPT do diretório atual ?
Respostas:
Você pode usar find:
find . -type f ! -name '*.txt' -delete
Ou os recursos de globbing estendidos do bash:
shopt -s extglob
rm *.!(txt)
Ou no zsh:
setopt extendedglob
rm *~*.txt(.)
# || ^^^ Only plain files
# ||^^^^^ files ending in ".txt"
# | \Except
# \Everything
*.!(txt)ser !(*.txt)?
rmsufocariam se houvesse pastas.
find . -type f ! -name "*.txt" | xargs -r rmfuncionaria no GNU \ xargs. Comando BSD e UNIX xargs podem não ter -r você tem que verificar o seu local deman xargs
Se você quiser excluir todos os arquivos, exceto '* .txt', poderá usar o seguinte comando:
$ find . -type f ! -name "*.txt" -exec rm -rf {} \;
mas se você também quiser excluir diretórios junto com os arquivos, poderá usar o seguinte:
$ find . ! -name "*.txt" -exec rm -r {} \;
Você pode usar grep e xargs invertidos
ls | grep -v .txt$| xargs rm
ls | grep -v *.txt | xargs rmfunciona da mesma maneira #
grep -v *.txtfuncionará apenas se houver exatamente um .txtarquivo. Se não houver, grepserá usado *.txtcomo padrão; se houver mais de um, ele procurará o primeiro nome do arquivo dentro de todos os outros .txtarquivos, ignorando a saída de ls. (Resultados exactos podem depender de opções glob do shell.)
.txt$corresponderá as strings que terminam com txtindependentemente do ponto. Porque grepusa expressão regular como parâmetro. Assim, arquivos a.txte aatxte a-txttudo vai ser acompanhado por esta expressão. Expressão correta deve ser ls | grep -v \\.txt$ | xargs --no-run-if-empty rm. Para pessoas curiosas: se você quiser brincar com a expressão, use com segurança essa expressão de teste ls | grep \\.txt$ | xargs --no-run-if-empty echo(nota: não há -vsinalizador e rm=>echo). Nota 2: você pode ter notado uma barra invertida dupla. Um é para regex, outro é para que o bash escape da barra.
Simplesmente faça:
rm $(ls -I "*.txt" ) # Exclui o tipo de arquivo, exceto * .txt
Da mesma forma, se for necessário excluir "exceto um ou mais tipos de arquivo", faça:
rm $(ls -I "*.txt" -I "*.pdf" ) # Exclui tipos de arquivo, exceto * .txt e * .pdf
-Iopção pode ser útil, mas veja por que não analisar ls . E o que isso | xargsalcança? Sem argumentos, ele roda echoem todas as suas entradas.
xargssuposto alcançar?
Isso também funciona para remover todos os arquivos e pastas ocultos (pontos), exceto o indicado ( .mydir):
rm -rf $(ls -aI ".mydir")
lsantes de realmente tentar ligarrm.