Eu sei como excluir todos os txt
arquivos no diretório atual por rm *.txt
. Alguém sabe como excluir todos os arquivos no txt
arquivo EXCEPT do diretório atual ?
Eu sei como excluir todos os txt
arquivos no diretório atual por rm *.txt
. Alguém sabe como excluir todos os arquivos no txt
arquivo 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)
?
rm
sufocariam se houvesse pastas.
find . -type f ! -name "*.txt" | xargs -r rm
funcionaria 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 rm
funciona da mesma maneira #
grep -v *.txt
funcionará apenas se houver exatamente um .txt
arquivo. Se não houver, grep
será usado *.txt
como padrão; se houver mais de um, ele procurará o primeiro nome do arquivo dentro de todos os outros .txt
arquivos, ignorando a saída de ls
. (Resultados exactos podem depender de opções glob do shell.)
.txt$
corresponderá as strings que terminam com txt
independentemente do ponto. Porque grep
usa expressão regular como parâmetro. Assim, arquivos a.txt
e aatxt
e a-txt
tudo 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á -v
sinalizador 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
-I
opção pode ser útil, mas veja por que não analisar ls . E o que isso | xargs
alcança? Sem argumentos, ele roda echo
em todas as suas entradas.
xargs
suposto alcançar?
Isso também funciona para remover todos os arquivos e pastas ocultos (pontos), exceto o indicado ( .mydir
):
rm -rf $(ls -aI ".mydir")
ls
antes de realmente tentar ligarrm
.