Introdução ao terminal
Aviso: Este post foi traduzido para o português usando um modelo de tradução automática. Por favor, me avise se encontrar algum erro.
Formato do post
Para não ter que ficar colocando imagens do console em cada ação que faço, criei a seguinte função que recebe o comando do terminal que queremos executar e devolve a saída que o terminal nos daria.
Às vezes usarei esta função, e outras usarei !
antes de cada comando, que em notebooks quer dizer que você vai executar um comando do terminal.
import subprocessimport oslast_directory = ''def terminal(command, max_lines_output=None):global last_directorydebug = Falsestr = command.split()# Check if there are " or ' charactersfor i in range(len(str)):if debug: print(f"i = {i}, str[i] = {str[i]}")if len(str[i]) > 0:if str[i][0] == '"' or str[i][0] == "'":for j in range(i+1,len(str)):if debug: print(f" j = {j}, str[j] = {str[j]}")if str[j][-1] == '"' or str[j][-1] == "'":for k in range(i+1,j+1):if debug: print(f" k = {k}, str[i] = {str[i]}, str[k] = {str[k]}")str[i] = str[i] + " " + str[k]if debug: print(f" k = {k}, str[i] = {str[i]}, str[k] = {str[k]}")str[j:] = [""]str[i] = str[i].replace('"','')# Remove empty stringsstr = [x for x in str if x != ""]if debug:print(str)returnif str[0] == "cd":last_dir = os.getcwd()if len(str) == 1:os.chdir('/home/wallabot')else:if str[1] == "-":os.chdir(last_directory)else:os.chdir(str[1])last_directory = last_direlse:result = subprocess.run(str, stdout=subprocess.PIPE).stdout.decode('utf-8')if max_lines_output is not None:result_split = result.split(' ')print(' '.join(result_split[:max_lines_output]))print(" ...")print(' '.join(result_split[-5:]))else:print(result)
Primeiros comandos para se movimentar pelo terminal
ls
(listar diretório)
O primeiro comando que vamos ver é ls
(list directory) que serve para listar todos os arquivos da pasta em que estamos.
import subprocessimport oslast_directory = ''def terminal(command, max_lines_output=None):global last_directorydebug = Falsestr = command.split()# Check if there are " or ' charactersfor i in range(len(str)):if debug: print(f"i = {i}, str[i] = {str[i]}")if len(str[i]) > 0:if str[i][0] == '"' or str[i][0] == "'":for j in range(i+1,len(str)):if debug: print(f"\t j = {j}, str[j] = {str[j]}")if str[j][-1] == '"' or str[j][-1] == "'":for k in range(i+1,j+1):if debug: print(f" k = {k}, str[i] = {str[i]}, str[k] = {str[k]}")str[i] = str[i] + " " + str[k]if debug: print(f" k = {k}, str[i] = {str[i]}, str[k] = {str[k]}")str[j:] = [""]str[i] = str[i].replace('"','')# Remove empty stringsstr = [x for x in str if x != ""]if debug:print(str)returnif str[0] == "cd":last_dir = os.getcwd()if len(str) == 1:os.chdir('/home/wallabot')else:if str[1] == "-":os.chdir(last_directory)else:os.chdir(str[1])last_directory = last_direlse:result = subprocess.run(str, stdout=subprocess.PIPE).stdout.decode('utf-8')if max_lines_output is not None:result_split = result.split('\n')print('\n'.join(result_split[:max_lines_output]))print("\t ...")print('\n'.join(result_split[-5:]))else:print(result)terminal("ls")
2021-02-11-Introduccion-a-Python.ipynb2021-04-23-Calculo-matricial-con-Numpy.ipynb2021-06-15-Manejo-de-datos-con-Pandas.ipynb2022-09-12 Introduccion a la terminal.ipynb2022-09-12 Introduccion a la terminal.txtcommand-line-cheat-sheet.pdfCSS.ipynbDocker.htmlDocker.ipynbExpresiones regulares.htmlExpresiones regulares.ipynbhtml_fileshtml.ipynbintroduccion_pythonmovies.csvmovies.datnotebooks_translated__pycache__ssh.ipynbtest.htmltest.ipynb
Os comandos normalmente podem receber opções (flags
), que são introduzidas com o caractere -
, por exemplo vejamos ls -l
que nos retorna a lista de arquivos do diretório em que estamos, mas com mais informações.
terminal('ls -l')
total 4512-rw-rw-r-- 1 wallabot wallabot 285898 nov 12 02:07 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 78450 nov 13 00:10 2021-04-23-Calculo-matricial-con-Numpy.ipynb-rw-rw-r-- 1 wallabot wallabot 484213 nov 13 00:44 2021-06-15-Manejo-de-datos-con-Pandas.ipynb-rw-rw-r-- 1 wallabot wallabot 320810 dic 6 00:11 2022-09-12 Introduccion a la terminal.ipynb-rw-rw-r-- 1 wallabot wallabot 320594 dic 6 00:04 2022-09-12 Introduccion a la terminal.txt-rw-rw-r-- 1 wallabot wallabot 119471 oct 3 16:13 command-line-cheat-sheet.pdf-rw-rw-r-- 1 wallabot wallabot 2660 sep 18 03:32 CSS.ipynb-rw-rw-r-- 1 wallabot wallabot 699225 nov 27 04:16 Docker.html-rw-rw-r-- 1 wallabot wallabot 509125 sep 22 16:48 Docker.ipynb-rw-rw-r-- 1 wallabot wallabot 156193 nov 27 04:21 Expresiones regulares.html-rw-rw-r-- 1 wallabot wallabot 53094 oct 2 04:57 Expresiones regulares.ipynbdrwxrwxr-x 2 wallabot wallabot 4096 nov 28 14:39 html_files-rw-rw-r-- 1 wallabot wallabot 14775 sep 18 03:29 html.ipynbdrwxrwxr-x 3 wallabot wallabot 4096 nov 12 01:51 introduccion_python-rw-rw-r-- 1 wallabot wallabot 446172 oct 2 04:39 movies.csv-rw-rw-r-- 1 wallabot wallabot 522197 oct 2 04:33 movies.datdrwxrwxr-x 2 wallabot wallabot 4096 nov 28 14:39 notebooks_translateddrwxrwxr-x 2 wallabot wallabot 4096 ago 27 03:25 __pycache__-rw-rw-r-- 1 wallabot wallabot 586 dic 4 02:31 ssh.ipynb-rw-rw-r-- 1 wallabot wallabot 292936 nov 9 01:46 test.html-rw-rw-r-- 1 wallabot wallabot 260227 nov 9 01:13 test.ipynb
Como vemos, temos quantos bytes ocupa cada arquivo, mas quando temos arquivos que ocupam muito isto não é muito fácil de ler, então podemos adicionar a opção h
(human
) que nos dá informações mais fáceis de ler
terminal('ls -lh')
total 4,5M-rw-rw-r-- 1 wallabot wallabot 280K nov 12 02:07 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 77K nov 13 00:10 2021-04-23-Calculo-matricial-con-Numpy.ipynb-rw-rw-r-- 1 wallabot wallabot 473K nov 13 00:44 2021-06-15-Manejo-de-datos-con-Pandas.ipynb-rw-rw-r-- 1 wallabot wallabot 314K dic 6 00:11 2022-09-12 Introduccion a la terminal.ipynb-rw-rw-r-- 1 wallabot wallabot 314K dic 6 00:04 2022-09-12 Introduccion a la terminal.txt-rw-rw-r-- 1 wallabot wallabot 117K oct 3 16:13 command-line-cheat-sheet.pdf-rw-rw-r-- 1 wallabot wallabot 2,6K sep 18 03:32 CSS.ipynb-rw-rw-r-- 1 wallabot wallabot 683K nov 27 04:16 Docker.html-rw-rw-r-- 1 wallabot wallabot 498K sep 22 16:48 Docker.ipynb-rw-rw-r-- 1 wallabot wallabot 153K nov 27 04:21 Expresiones regulares.html-rw-rw-r-- 1 wallabot wallabot 52K oct 2 04:57 Expresiones regulares.ipynbdrwxrwxr-x 2 wallabot wallabot 4,0K nov 28 14:39 html_files-rw-rw-r-- 1 wallabot wallabot 15K sep 18 03:29 html.ipynbdrwxrwxr-x 3 wallabot wallabot 4,0K nov 12 01:51 introduccion_python-rw-rw-r-- 1 wallabot wallabot 436K oct 2 04:39 movies.csv-rw-rw-r-- 1 wallabot wallabot 510K oct 2 04:33 movies.datdrwxrwxr-x 2 wallabot wallabot 4,0K nov 28 14:39 notebooks_translateddrwxrwxr-x 2 wallabot wallabot 4,0K ago 27 03:25 __pycache__-rw-rw-r-- 1 wallabot wallabot 586 dic 4 02:31 ssh.ipynb-rw-rw-r-- 1 wallabot wallabot 287K nov 9 01:46 test.html-rw-rw-r-- 1 wallabot wallabot 255K nov 9 01:13 test.ipynb
Se quisermos ver os arquivos ocultos, podemos usar a opção a
, que nos mostrará todos os arquivos de um diretório
terminal('ls -lha')
total 4,5Mdrwxrwxr-x 6 wallabot wallabot 4,0K dic 6 00:04 .drwxrwxr-x 5 wallabot wallabot 4,0K oct 2 03:10 ..-rw-rw-r-- 1 wallabot wallabot 280K nov 12 02:07 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 77K nov 13 00:10 2021-04-23-Calculo-matricial-con-Numpy.ipynb-rw-rw-r-- 1 wallabot wallabot 473K nov 13 00:44 2021-06-15-Manejo-de-datos-con-Pandas.ipynb-rw-rw-r-- 1 wallabot wallabot 314K dic 6 00:11 2022-09-12 Introduccion a la terminal.ipynb-rw-rw-r-- 1 wallabot wallabot 314K dic 6 00:04 2022-09-12 Introduccion a la terminal.txt-rw-rw-r-- 1 wallabot wallabot 117K oct 3 16:13 command-line-cheat-sheet.pdf-rw-rw-r-- 1 wallabot wallabot 2,6K sep 18 03:32 CSS.ipynb-rw-rw-r-- 1 wallabot wallabot 683K nov 27 04:16 Docker.html-rw-rw-r-- 1 wallabot wallabot 498K sep 22 16:48 Docker.ipynb-rw-rw-r-- 1 wallabot wallabot 153K nov 27 04:21 Expresiones regulares.html-rw-rw-r-- 1 wallabot wallabot 52K oct 2 04:57 Expresiones regulares.ipynbdrwxrwxr-x 2 wallabot wallabot 4,0K nov 28 14:39 html_files-rw-rw-r-- 1 wallabot wallabot 15K sep 18 03:29 html.ipynbdrwxrwxr-x 3 wallabot wallabot 4,0K nov 12 01:51 introduccion_python-rw-rw-r-- 1 wallabot wallabot 436K oct 2 04:39 movies.csv-rw-rw-r-- 1 wallabot wallabot 510K oct 2 04:33 movies.datdrwxrwxr-x 2 wallabot wallabot 4,0K nov 28 14:39 notebooks_translateddrwxrwxr-x 2 wallabot wallabot 4,0K ago 27 03:25 __pycache__-rw-rw-r-- 1 wallabot wallabot 586 dic 4 02:31 ssh.ipynb-rw-rw-r-- 1 wallabot wallabot 287K nov 9 01:46 test.html-rw-rw-r-- 1 wallabot wallabot 255K nov 9 01:13 test.ipynb
Se o que queremos é que ele ordene por tamanho, podemos usar a opção S
terminal('ls -lhS')
total 4,5M-rw-rw-r-- 1 wallabot wallabot 683K nov 27 04:16 Docker.html-rw-rw-r-- 1 wallabot wallabot 510K oct 2 04:33 movies.dat-rw-rw-r-- 1 wallabot wallabot 498K sep 22 16:48 Docker.ipynb-rw-rw-r-- 1 wallabot wallabot 473K nov 13 00:44 2021-06-15-Manejo-de-datos-con-Pandas.ipynb-rw-rw-r-- 1 wallabot wallabot 436K oct 2 04:39 movies.csv-rw-rw-r-- 1 wallabot wallabot 314K dic 6 00:11 2022-09-12 Introduccion a la terminal.ipynb-rw-rw-r-- 1 wallabot wallabot 314K dic 6 00:04 2022-09-12 Introduccion a la terminal.txt-rw-rw-r-- 1 wallabot wallabot 287K nov 9 01:46 test.html-rw-rw-r-- 1 wallabot wallabot 280K nov 12 02:07 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 255K nov 9 01:13 test.ipynb-rw-rw-r-- 1 wallabot wallabot 153K nov 27 04:21 Expresiones regulares.html-rw-rw-r-- 1 wallabot wallabot 117K oct 3 16:13 command-line-cheat-sheet.pdf-rw-rw-r-- 1 wallabot wallabot 77K nov 13 00:10 2021-04-23-Calculo-matricial-con-Numpy.ipynb-rw-rw-r-- 1 wallabot wallabot 52K oct 2 04:57 Expresiones regulares.ipynb-rw-rw-r-- 1 wallabot wallabot 15K sep 18 03:29 html.ipynbdrwxrwxr-x 2 wallabot wallabot 4,0K nov 28 14:39 html_filesdrwxrwxr-x 3 wallabot wallabot 4,0K nov 12 01:51 introduccion_pythondrwxrwxr-x 2 wallabot wallabot 4,0K nov 28 14:39 notebooks_translateddrwxrwxr-x 2 wallabot wallabot 4,0K ago 27 03:25 __pycache__-rw-rw-r-- 1 wallabot wallabot 2,6K sep 18 03:32 CSS.ipynb-rw-rw-r-- 1 wallabot wallabot 586 dic 4 02:31 ssh.ipynb
Se quisermos que nos mostre os arquivos ordenados alfabeticamente, mas ao contrário, devemos usar a opção -r
terminal('ls -lhr')
total 4,5M-rw-rw-r-- 1 wallabot wallabot 255K nov 9 01:13 test.ipynb-rw-rw-r-- 1 wallabot wallabot 287K nov 9 01:46 test.html-rw-rw-r-- 1 wallabot wallabot 586 dic 4 02:31 ssh.ipynbdrwxrwxr-x 2 wallabot wallabot 4,0K ago 27 03:25 __pycache__drwxrwxr-x 2 wallabot wallabot 4,0K nov 28 14:39 notebooks_translated-rw-rw-r-- 1 wallabot wallabot 510K oct 2 04:33 movies.dat-rw-rw-r-- 1 wallabot wallabot 436K oct 2 04:39 movies.csvdrwxrwxr-x 3 wallabot wallabot 4,0K nov 12 01:51 introduccion_python-rw-rw-r-- 1 wallabot wallabot 15K sep 18 03:29 html.ipynbdrwxrwxr-x 2 wallabot wallabot 4,0K nov 28 14:39 html_files-rw-rw-r-- 1 wallabot wallabot 52K oct 2 04:57 Expresiones regulares.ipynb-rw-rw-r-- 1 wallabot wallabot 153K nov 27 04:21 Expresiones regulares.html-rw-rw-r-- 1 wallabot wallabot 498K sep 22 16:48 Docker.ipynb-rw-rw-r-- 1 wallabot wallabot 683K nov 27 04:16 Docker.html-rw-rw-r-- 1 wallabot wallabot 2,6K sep 18 03:32 CSS.ipynb-rw-rw-r-- 1 wallabot wallabot 117K oct 3 16:13 command-line-cheat-sheet.pdf-rw-rw-r-- 1 wallabot wallabot 314K dic 6 00:04 2022-09-12 Introduccion a la terminal.txt-rw-rw-r-- 1 wallabot wallabot 314K dic 6 00:11 2022-09-12 Introduccion a la terminal.ipynb-rw-rw-r-- 1 wallabot wallabot 473K nov 13 00:44 2021-06-15-Manejo-de-datos-con-Pandas.ipynb-rw-rw-r-- 1 wallabot wallabot 77K nov 13 00:10 2021-04-23-Calculo-matricial-con-Numpy.ipynb-rw-rw-r-- 1 wallabot wallabot 280K nov 12 02:07 2021-02-11-Introduccion-a-Python.ipynb
cd
(change directory)
O segundo comando será cd
(change directory) que nos permite mudar de diretório
terminal('cd /home/wallabot/Documentos/')
Se agora usarmos ls
para ver os arquivos que temos, vemos que mudam
terminal('cd /home/wallabot/Documentos/')terminal('ls')
aprendiendo-git.pdfbalena-etcher-electron-1.7.9-linux-x64camerasIPDocumentaciongstreamergstreamer_oldjetsonNanokaggleLibrosnerfprueba.txtpytorchwallabotweb
Se ao cd
, em vez de lhe dar o diretório para o qual queremos mover, dermos o caractere -
, ele voltará ao diretório anterior onde estávamos.
terminal('cd -')
terminal('cd -')terminal('ls')
2021-02-11-Introduccion-a-Python.ipynb2021-04-23-Calculo-matricial-con-Numpy.ipynb2021-06-15-Manejo-de-datos-con-Pandas.ipynb2022-09-12 Introduccion a la terminal.ipynb2022-09-12 Introduccion a la terminal.txtcommand-line-cheat-sheet.pdfCSS.ipynbDocker.htmlDocker.ipynbExpresiones regulares.htmlExpresiones regulares.ipynbhtml_fileshtml.ipynbintroduccion_pythonmovies.csvmovies.datnotebooks_translated__pycache__ssh.ipynbtest.htmltest.ipynb
Se quisermos ir para o home
, basta introduzir cd
no terminal e ele nos levará.
terminal('cd')
pwd
(imprimir diretório de trabalho)
Para obter o diretório em que estamos, podemos usar pwd
(print working directory)
terminal('cd')terminal('pwd')
/home/wallabot
Podemos movernos mediante o comando cd
mediante rotas relativas e mediante rotas absolutas. Por exemplo, vamos mover-nos a um diretório mediante uma rota absoluta.
terminal('cd /home/wallabot/Documentos/')
terminal('cd /home/wallabot/Documentos/')terminal('pwd')
/home/wallabot/Documentos
terminal('ls')
aprendiendo-git.pdfbalena-etcher-electron-1.7.9-linux-x64camerasIPDocumentaciongstreamergstreamer_oldjetsonNanokaggleLibrosnerfprueba.txtpytorchwallabotweb
Podemos mover-nos por rotas relativas se apenas colocarmos o endereço a partir do ponto em que nos encontramos
terminal('cd web')
terminal('cd web')terminal('pwd')
/home/wallabot/Documentos/web
Também podemos subir um diretório usando ..
através de rotas relativas.
terminal('cd ..')
terminal('cd ..')terminal('pwd')
/home/wallabot/Documentos
Se em vez de ..
colocarmos .
estamos nos referindo ao diretório em que nos encontramos agora mesmo, ou seja, se colocarmos cd .
não nos moveremos, pois estamos dizendo ao terminal para ir ao diretório em que estamos.
terminal('cd .')
terminal('cd .')terminal('pwd')
/home/wallabot/Documentos
Vamos nos mover para um caminho onde tenhamos arquivos para mostrar o seguinte comando
terminal('cd web/portafolio/posts/')
terminal('cd web/portafolio/posts/')terminal('ls')
2021-02-11-Introduccion-a-Python.ipynb2021-04-23-Calculo-matricial-con-Numpy.ipynb2021-06-15-Manejo-de-datos-con-Pandas.ipynb2022-09-12 Introduccion a la terminal.ipynb2022-09-12 Introduccion a la terminal.txtcommand-line-cheat-sheet.pdfCSS.ipynbDocker.htmlDocker.ipynbExpresiones regulares.htmlExpresiones regulares.ipynbhtml_fileshtml.ipynbintroduccion_pythonmovies.csvmovies.datnotebooks_translated__pycache__ssh.ipynbtest.htmltest.ipynb
Informações dos arquivos com file
Se eu não souber que tipo de arquivo é algum em particular, através do comando file
posso obter uma descrição
terminal('file 2021-02-11-Introduccion-a-Python.ipynb')
2021-02-11-Introduccion-a-Python.ipynb: UTF-8 Unicode text, with very long lines
Manipulando arquivos e diretórios
Vamos primeiro para a home.
terminal('cd /home/wallabot/Documentos/')
Árvore de diretórios com tree
Podemos ver toda a estrutura da pasta em que estamos através do comando tree
terminal('cd /home/wallabot/Documentos/')terminal('tree', max_lines_output=20)
.├── aprendiendo-git.pdf├── balena-etcher-electron-1.7.9-linux-x64│ └── balenaEtcher-1.7.9-x64.AppImage├── camerasIP│ ├── camerasIP.py│ ├── camerasIP.sh│ ├── config.py│ ├── __pycache__│ │ ├── config.cpython-38.pyc│ │ └── config.cpython-39.pyc│ └── README.md├── Documentacion│ ├── Curriculum Vitae (5).pdf│ ├── Firma Pris.PNG│ └── Firma.png├── gstreamer│ ├── basic_tutorial_c│ │ ├── basic_tutorial_1_hello_world│ │ │ ├── basic-tutorial-1...├── upload_page.py└── utils.py873 directories, 119679 files
Mas na saída temos muitas linhas, e isso é porque tree
é um comando que mostra todos os arquivos desde o caminho em que estamos, portanto é um pouco difícil de ler. No entanto, com a opção L
podemos indicar o número de níveis que queremos que aprofunde
terminal('tree -L 2')
.├── aprendiendo-git.pdf├── balena-etcher-electron-1.7.9-linux-x64│ └── balenaEtcher-1.7.9-x64.AppImage├── camerasIP│ ├── camerasIP.py│ ├── camerasIP.sh│ ├── config.py│ ├── __pycache__│ └── README.md├── Documentacion│ ├── Curriculum Vitae (5).pdf│ ├── Firma Pris.PNG│ └── Firma.png├── gstreamer│ ├── basic_tutorial_c│ └── README.md├── gstreamer_old│ ├── basic_tutorial_c│ └── basic_tutorial_python├── jetsonNano│ ├── apuntes-Jetson-Nano│ ├── deepstream_apps│ ├── deepstream_nano│ └── Digital zoom├── kaggle│ └── hubmap├── Libros│ └── aprendiendo-git.pdf├── nerf│ └── instant-ngp├── prueba.txt├── pytorch│ └── Curso_Pytorch├── wallabot│ ├── Microfono - Blue Yeti X│ ├── placa base - Asus prime x570-p│ └── Silla - Corsair T3 Rush└── web├── jupyter-to-html├── jupyter-translator├── portafolio└── wordpress_api_rest30 directories, 12 files
Podemos ver que mostra que há 30 diretórios e 12 arquivos, enquanto antes indicava 873 diretórios, 119679 arquivos
Criar pastas com mkdir
(make directory)
Se queremos criar um novo diretório, podemos usar o comando mkdir
(make directory) e um nome
terminal("cd /home/wallabot/Documentos/web/portafolio/posts/")
terminal("cd /home/wallabot/Documentos/web/portafolio/posts/")terminal('mkdir prueba')
terminal('ls')
2021-02-11-Introduccion-a-Python.ipynb2021-04-23-Calculo-matricial-con-Numpy.ipynb2021-06-15-Manejo-de-datos-con-Pandas.ipynb2022-09-12 Introduccion a la terminal.ipynb2022-09-12 Introduccion a la terminal.txtcommand-line-cheat-sheet.pdfCSS.ipynbDocker.htmlDocker.ipynbExpresiones regulares.htmlExpresiones regulares.ipynbhtml_fileshtml.ipynbintroduccion_pythonmovies.csvmovies.datnotebooks_translatedprueba__pycache__ssh.ipynbtest.htmltest.ipynb
Se queremos criar um diretório com espaços no nome, temos que colocar o nome entre aspas.
terminal('mkdir "directorio prueba"')
terminal('ls')
2021-02-11-Introduccion-a-Python.ipynb2021-04-23-Calculo-matricial-con-Numpy.ipynb2021-06-15-Manejo-de-datos-con-Pandas.ipynb2022-09-12 Introduccion a la terminal.ipynb2022-09-12 Introduccion a la terminal.txtcommand-line-cheat-sheet.pdfCSS.ipynbdirectorio pruebaDocker.htmlDocker.ipynbExpresiones regulares.htmlExpresiones regulares.ipynbhtml_fileshtml.ipynbintroduccion_pythonmovies.csvmovies.datnotebooks_translatedprueba__pycache__ssh.ipynbtest.htmltest.ipynb
Vamos entrar na pasta prueba
que criamos, para continuar vendo o terminal lá
terminal("cd prueba")
Criar arquivos com touch
Caso que queiramos criar um arquivo, o comando que temos que usar é touch
terminal("cd prueba")terminal("touch prueba.txt")
terminal("ls")
prueba.txt
Copiar arquivos com cp
(copy)
Se queremos copiar um arquivo, fazemos isso através do comando cp
(copy)
terminal("cp prueba.txt prueba_copy.txt")
terminal("ls")
prueba_copy.txtprueba.txt
Mover arquivos com mv
(move)
Se o que queremos é movê-lo, o que usamos é o comando mv
(move)
terminal("mv prueba.txt ../prueba.txt")
terminal("ls")
prueba_copy.txt
terminal("ls ../")
2021-02-11-Introduccion-a-Python.ipynb2021-04-23-Calculo-matricial-con-Numpy.ipynb2021-06-15-Manejo-de-datos-con-Pandas.ipynb2022-09-12 Introduccion a la terminal.ipynb2022-09-12 Introduccion a la terminal.txtcommand-line-cheat-sheet.pdfCSS.ipynbdirectorio pruebaDocker.htmlDocker.ipynbExpresiones regulares.htmlExpresiones regulares.ipynbhtml_fileshtml.ipynbintroduccion_pythonmovies.csvmovies.datnotebooks_translatedpruebaprueba.txt__pycache__ssh.ipynbtest.htmltest.ipynb
Renomear arquivos com mv
(move)
O comando mv
também serve para renomear arquivos, já que se o que fazemos é movê-lo no mesmo diretório, mas dando outro nome, no final isso é renomear o arquivo.
terminal("mv prueba_copy.txt prueba_move.txt")
terminal("ls")
prueba_move.txt
Excluir arquivos com rm
(remove)
Para excluir arquivos ou diretórios usamos o comando rm
(remove)
terminal("rm prueba_move.txt")
terminal("ls")
Remover diretórios com rm -r
(remove recursive)
Se o que queremos é eliminar um diretório com arquivos dentro, devemos usar a flag -r
.
terminal("cd ..")
terminal("cd ..")terminal('rm -r "directorio prueba"')
terminal("ls")
2021-02-11-Introduccion-a-Python.ipynb2021-04-23-Calculo-matricial-con-Numpy.ipynb2021-06-15-Manejo-de-datos-con-Pandas.ipynb2022-09-12 Introduccion a la terminal.ipynb2022-09-12 Introduccion a la terminal.txtcommand-line-cheat-sheet.pdfCSS.ipynbDocker.htmlDocker.ipynbExpresiones regulares.htmlExpresiones regulares.ipynbhtml_fileshtml.ipynbintroduccion_pythonmovies.csvmovies.datnotebooks_translatedpruebaprueba.txt__pycache__ssh.ipynbtest.htmltest.ipynb
Como podes ver nunca pergunta se estamos seguros, para que pergunte há que adicionar a flag -i
(iteractive
)
terminal("rm -i prueba.txt")
rm: ¿borrar el fichero regular vacío 'prueba.txt'? (s/n) s
Sincronizar arquivos mediante rsync
Até agora vimos como copiar, mover e excluir arquivos, mas suponhamos que temos uma pasta e copiamos esses arquivos para outra. Agora suponhamos que modificamos um arquivo da primeira pasta e queremos que a segunda tenha as mudanças. Temos duas opções, voltar a copiar todos os arquivos, ou fazer uma sincronização usando rsync
Primeiro vamos criar uma nova pasta na qual criaremos vários arquivos
!mkdir sourcefolder!touch sourcefolder/file1 sourcefolder/file2 sourcefolder/file3
Agora criamos uma segunda pasta que é a que vamos sincronizar com a primeira
!mkdir sourcefolder!touch sourcefolder/file1 sourcefolder/file2 sourcefolder/file3!mkdir syncfolder
!mkdir sourcefolder!touch sourcefolder/file1 sourcefolder/file2 sourcefolder/file3!mkdir syncfolder!echo "ls sourcefolder:" && ls sourcefolder && echo "ls syncfolder:" && ls syncfolder
ls sourcefolder:file1 file2 file3ls syncfolder:
Sincronizamos as duas pastas com rsync
, a primeira vez apenas copiará os arquivos da primeira pasta para a segunda. Para fazer isso, além disso, devemos adicionar a flag -r
(recursive)
!rsync -r sourcefolder/ syncfolder/
!rsync -r sourcefolder/ syncfolder/!echo "ls sourcefolder:" && ls sourcefolder && echo "ls syncfolder:" && ls syncfolder
ls sourcefolder:file1 file2 file3ls syncfolder:file1 file2 file3
Se agora eu criar um novo arquivo em sourcefolder
e sincronizar novamente, apenas esse arquivo será copiado para o syncfolder
. Para ver que apenas um arquivo será copiado, podemos usar o flag -v
(verbose)
!touch sourcefolder/file4
!touch sourcefolder/file4!rsync -r -v sourcefolder/ syncfolder/
sending incremental file listfile1file2file3file4sent 269 bytes received 92 bytes 722.00 bytes/sectotal size is 0 speedup is 0.00
Mas parece que copiou todos os arquivos, então para que isso não aconteça e copie apenas os que foram modificados, é preciso usar a flag -u
!touch sourcefolder/file5
!touch sourcefolder/file5!rsync -r -v -u sourcefolder/ syncfolder/
sending incremental file listfile5sent 165 bytes received 35 bytes 400.00 bytes/sectotal size is 0 speedup is 0.00
!echo "ls sourcefolder:" && ls sourcefolder && echo "ls syncfolder:" && ls syncfolder
ls sourcefolder:file1 file2 file3 file4 file5ls syncfolder:file1 file2 file3 file4 file5
E o que acontece se eu criar um novo arquivo em syncfolder
?
!touch syncfolder/file6
!touch syncfolder/file6!rsync -r -v -u sourcefolder/ syncfolder/
sending incremental file listsent 122 bytes received 12 bytes 268.00 bytes/sectotal size is 0 speedup is 0.00
!echo "ls sourcefolder:" && ls sourcefolder && echo "ls syncfolder:" && ls syncfolder
ls sourcefolder:file1 file2 file3 file4 file5ls syncfolder:file1 file2 file3 file4 file5 file6
Não o sincroniza, então é importante ter isso em mente
Algumas flags importantes a serem levadas em consideração são:
-a
: Este flag é um atalho para várias opções, incluindo-r
(recursivo),-l
(copiar links simbólicos),-p
(manter permissões),-t
(manter o horário de modificação) e-g
(manter grupo). Esta opção é útil para fazer uma cópia exata de um diretório, incluindo todas as suas subpastas e arquivos. *-v
: Este flag ativa a saída detalhada, que mostra os arquivos que estão sendo copiados e o progresso da operação. *-r
: Esta flag é utilizada para copiar de forma recursiva, o que significa que copia todas as subpastas e arquivos dentro de um diretório. *-u
: Esta flag é utilizada para copiar apenas os arquivos novos ou modificados. Se um arquivo já existe no destino e é mais recente que o arquivo de origem, não é copiado. *-n
: Esta flag é usada para fazer um teste de cópia, o que significa que não são efetuadas alterações no destino.*--exclude
: Esta opção é usada para excluir arquivos ou pastas específicos da operação de cópia. Você pode especificar vários arquivos ou pastas para excluir utilizando esta opção várias vezes. *-z
: Este flag é utilizado para comprimir os dados durante a transferência, o que reduz a largura de banda utilizada e acelera a velocidade de transferência.*-h
: esta flag é usada para mostrar a informação em um formato mais legível, especialmente quando se trabalha com grandes quantidades de dados ou tamanhos de arquivos grandes.
Deletamos as duas pastas criadas
!rm -r sourcefolder syncfolder
Explorando o conteúdo dos arquivos
Para não ter que abrir um arquivo a partir de uma interface gráfica, temos várias maneiras. Vou copiar um arquivo de texto nesta pasta primeiro.
!rm -r sourcefolder syncfolderterminal("cd prueba")
!rm -r sourcefolder syncfolderterminal("cd prueba")terminal("cp ../2021-02-11-Introduccion-a-Python.ipynb .")
terminal("ls")
2021-02-11-Introduccion-a-Python.ipynb
Cabeçalho de arquivos com head
O primeiro comando para poder ver dentro de um arquivo de texto é head
, que nos permite ver as primeiras 10 linhas de um arquivo, mas se você adicionar a flag -n
pode indicar o número de linhas.
terminal("head 2021-02-11-Introduccion-a-Python.ipynb")
{"cells": [{"cell_type": "markdown","metadata": {"id": "dsaKCKL0IxZl"},"source": ["# Introducción a Python"]
terminal("head -n 5 2021-02-11-Introduccion-a-Python.ipynb")
{"cells": [{"cell_type": "markdown","metadata": {
Cauda de um arquivo com tail
Em caso de querer ver as últimas linhas usamos tail
terminal("tail 2021-02-11-Introduccion-a-Python.ipynb")
},"vscode": {"interpreter": {"hash": "d5745ab6aba164e1152437c779991855725055592b9f2bdb41a4825db7168d26"}}},"nbformat": 4,"nbformat_minor": 0}
terminal("tail -n 5 2021-02-11-Introduccion-a-Python.ipynb")
}},"nbformat": 4,"nbformat_minor": 0}
Se quisermos ver continuamente as últimas linhas de um arquivo, por exemplo, queremos estar monitorando continuamente um arquivo de LOG para ver eventos, adicionamos o flag -f
, isso fará com que o terminal fique continuamente verificando o arquivo, e cada vez que aparecer uma nova linha nele, ela será mostrada.
Por exemplo, se eu monitoro o log de início de sessão na minha máquina
!tail -f /var/log/auth.log
Dec 1 16:27:22 wallabot gcr-prompter[1457]: Gcr: calling the PromptDone method on /org/gnome/keyring/Prompt/p2@:1.26, and ignoring replyDec 1 16:27:22 wallabot gnome-keyring-daemon[1178]: asked to register item /org/freedesktop/secrets/collection/login/10, but it's already registeredDec 1 16:27:26 wallabot systemd-logind[835]: Watching system buttons on /dev/input/event28 (Logitech Wireless Mouse MX Master 3)Dec 1 16:27:33 wallabot gcr-prompter[1457]: Gcr: 10 second inactivity timeout, quittingDec 1 16:27:33 wallabot gcr-prompter[1457]: Gcr: unregistering prompterDec 1 16:27:33 wallabot gcr-prompter[1457]: Gcr: disposing prompterDec 1 16:27:33 wallabot gcr-prompter[1457]: Gcr: finalizing prompterDec 1 16:27:34 wallabot polkitd(authority=local): Operator of unix-session:1 successfully authenticated as unix-user:wallabot to gain TEMPORARY authorization for action org.debian.apt.install-or-remove-packages for system-bus-name::1.96 [/usr/bin/python3 /usr/bin/update-manager --no-update --no-focus-on-map] (owned by unix-user:wallabot)Dec 1 16:27:42 wallabot systemd-logind[835]: Watching system buttons on /dev/input/event30 (T9-R (AVRCP))Dec 1 16:27:49 wallabot gnome-keyring-daemon[1178]: asked to register item /org/freedesktop/secrets/collection/login/2, but it's already registered
Vemos nas duas últimas linhas meu início de sessão quando liguei hoje meu computador.
Agora conecto-me por SSH à minha própria máquina
!ssh localhost
wallabot@localhost's password:Welcome to Ubuntu 20.04.5 LTS (GNU/Linux 5.15.0-53-generic x86_64)* Documentation: https://help.ubuntu.com* Management: https://landscape.canonical.com* Support: https://ubuntu.com/advantage1 device has a firmware upgrade available.Run `fwupdmgr get-upgrades` for more information.Se pueden aplicar 0 actualizaciones de forma inmediata.Your Hardware Enablement Stack (HWE) is supported until April 2025.*** System restart required ***Last login: Sun May 8 02:18:09 2022 from 192.168.1.147
Na console onde estava monitorando o início de sessão apareceram duas novas linhas
Dec 1 16:32:23 wallabot sshd[25647]: Accepted password for wallabot from 127.0.0.1 port 54668 ssh2Dec 1 16:32:23 wallabot sshd[25647]: pam_unix(sshd:session): session opened for user wallabot by (uid=0)Dec 1 16:32:23 wallabot systemd-logind[835]: New session 4 of user wallabot.
E quando fecho a sessão SSH, aparecem mais duas novas linhas
Dec 1 16:33:52 wallabot sshd[25647]: pam_unix(sshd:session): session closed for user wallabotDec 1 16:33:52 wallabot systemd-logind[835]: Session 4 logged out. Waiting for processes to exit.Dec 1 16:33:52 wallabot systemd-logind[835]: Removed session 4.
O visualizador de arquivos mais poderoso: less
Um dos comandos mais poderosos para visualizar arquivos é less
terminal("less 2021-02-11-Introduccion-a-Python.ipynb", max_lines_output=20)
{"cells": [{"cell_type": "markdown","metadata": {"id": "dsaKCKL0IxZl"},"source": ["# Introducción a Python"]},{"cell_type": "markdown","metadata": {"id": "Ho_8zgIiI0We"},"source": ["## 1. Resumen"]},...},"nbformat": 4,"nbformat_minor": 0}
Ao estar dentro de um caderno não é possível ver o que realmente acontece ao usar less
, mas quando o usamos, entramos no documento, podemos nos mover através dele usando as teclas ou o mouse.
Se queremos buscar algo dentro do documento, escrevemos o caractere /
e o que quisermos buscar. Para alternar entre as diferentes instâncias encontradas pressionamos a tecla n
, e se quisermos voltar para trás nas buscas pressionamos shift+n
Para sair basta pressionar q
O visualizador cat
Não permite navegar pelo arquivo nem fazer buscas.
terminal("cat 2021-02-11-Introduccion-a-Python.ipynb", max_lines_output=20)
{"cells": [{"cell_type": "markdown","metadata": {"id": "dsaKCKL0IxZl"},"source": ["# Introducción a Python"]},{"cell_type": "markdown","metadata": {"id": "Ho_8zgIiI0We"},"source": ["## 1. Resumen"]},...},"nbformat": 4,"nbformat_minor": 0}
Editor padrão do sistema xdg-open
Se quisermos abrir com o editor padrão do arquivo, temos que usar xdg-open
terminal("xdg-open 2021-02-11-Introducción-a-Python.ipynb")
Navegador de arquivos nautilus
Se o que queremos é abrir a pasta na qual estamos, usamos nautilus
terminal("nautilus")
E se o que queremos é que ele seja aberto em uma rota determinada, incluímos a rota
terminal("nautilus ~/")
Contador de palavras de um arquivo com wc
(word count)
Por último, um comando muito útil é wc
(word count), que te mostra quantas linhas, palavras e bytes tem um arquivo
terminal("wc 2021-02-11-Introduccion-a-Python.ipynb")
11678 25703 285898 2021-02-11-Introduccion-a-Python.ipynb
Como vemos, o arquivo tem 11678 linhas, 25703 palavras e ocupa 285898 bytes
O que é um comando
Um comando pode ser quatro coisas* Um programa executável, estes normalmente são guardados no caminho /usr/bin
* Um comando de shell * Uma função de shell * Um apelido
Para ver a que classe pertence um comando usamos type
!type cd
cd is a shell builtin
!type mkdir
mkdir is /usr/bin/mkdir
!type ls
ls is /usr/bin/ls
O que é um alias?
Um alias é um comando que definimos nós mesmos, este se define mediante o comando alias
. Por exemplo, vamos criar o alias l
que faça ls -h
!alias l='ls -l'
Quando executamos l
nos mostra o resultado de ls -h
!alias l='ls -l'!l
2021-02-11-Introducción-a-Python.ipynb
Mas isso tem o problema de que, quando fechamos o terminal, o alias
desaparece. Mais adiante, aprenderemos a criar alias
permanentes.
Ajuda dos comandos
Ajuda com help
Com muitos comandos do shell, podemos obter sua ajuda através do comando help
!help cd
cd: cd [-L|[-P [-e]]] [dir]Modifica el directorio de trabajo del shell.Modifica el directorio actual a DIR. DIR por defecto es el valor de lavariable de shell HOME.La variable CDPATH define la ruta de búsqueda para el directorio quecontiene DIR. Los nombres alternativos de directorio en CDPATH seseparan con dos puntos (:). Un nombre de directorio nulo es igual queel directorio actual. Si DIR comienza con una barra inclinada (/),entonces no se usa CDPATH.Si no se encuentra el directorio, y la opción del shell "cdable_vars"está activa, entonces se trata la palabra como un nombre de variable.Si esa variable tiene un valor, se utiliza su valor para DIR.Opciones:-L fuerza a seguir los enlaces simbólicos: resuelve los enlacessimbólicos en DIR después de procesar las instancias de ".."-P usa la estructura física de directorios sin seguir los enlacessimbólicos: resuelve los enlaces simbólicos en DIR antes de procesarlas instancias de ".."-e si se da la opción -P y el directorio actual de trabajo no sepuede determinar con éxito, termina con un estado diferente de cero.La acción por defecto es seguir los enlaces simbólicos, como si seespecificara "-L".".." se procesa quitando la componente del nombre de la ruta inmediatamenteanterior hasta una barra inclinada o el comienzo de DIR.Estado de Salida:Devuelve 0 si se cambia el directorio, y si $PWD está definido comocorrecto cuando se emplee -P; de otra forma es diferente a cero.
Manual com man
Outro comando é man
, que faz referência ao manual do usuário.
terminal("man ls", max_lines_output=20)
LS(1) User Commands LS(1)NAMEls - list directory contentsSYNOPSISls [OPTION]... [FILE]...DESCRIPTIONList information about the FILEs (the current directory by default).Sort entries alphabetically if none of -cftuvSUX nor --sort is speci‐fied.Mandatory arguments to long options are mandatory for short optionstoo.-a, --alldo not ignore entries starting with .-A, --almost-all...Full documentation at: <https://www.gnu.org/software/coreutils/ls>or available locally via: info '(coreutils) ls invocation'GNU coreutils 8.30 September 2019 LS(1)
Para sair, pressione q
, já que man
utiliza o less
como visualizador do manual
Informação com info
Outro comando é info
terminal("info ls", max_lines_output=20)
File: coreutils.info, Node: ls invocation, Next: dir invocation, Up: Directory listing10.1 ‘ls’: List directory contents==================================The ‘ls’ program lists information about files (of any type, includingdirectories). Options and file arguments can be intermixed arbitrarily,as usual.For non-option command-line arguments that are directories, bydefault ‘ls’ lists the contents of directories, not recursively, andomitting files with names beginning with ‘.’. For other non-optionarguments, by default ‘ls’ lists just the file name. If no non-optionargument is specified, ‘ls’ operates on the current directory, acting asif it had been invoked with a single argument of ‘.’.By default, the output is sorted alphabetically, according to thelocale settings in effect.(1) If standard output is a terminal, theoutput is in columns (sorted vertically) and control characters areoutput as question marks; otherwise, the output is listed one per line...‘--show-control-chars’Print nongraphic characters as-is in file names. This is thedefault unless the output is a terminal and the program is ‘ls’.
Para sair, pressione q
, já que info
usa less
como visualizador de informações
Informações de um comando com whatis
Outro comando é whatis
terminal("whatis ls")
ls (1) - list directory contents
Wildcards
As wildcards são caracteres especiais que nos servem para realizar buscas especiais. Por exemplo, se quero buscar todos os arquivos que terminem em .txt
. Vamos criar alguns arquivos para vê-las.
terminal("touch file.txt dot.txt dot2.txt index.html datos1 datos123 Abc")
terminal("ls")
2021-02-11-Introduccion-a-Python.ipynbAbcdatos1datos123dot2.txtdot.txtfile.txtindex.html
Todos os caracteres *
Vamos buscar agora todos os arquivos .txt
!ls *.txt
dot2.txt dot.txt file.txt
Vamos agora procurar todos que comecem com a palavra dados
!ls datos*
datos1 datos123
Números ?
Mas o que acontece se na realidade o que queremos é que nos mostre todos os arquivos que comecem pela palavra dados
mas seguido apenas de um número, temos que colocar um ponto de interrogação ?
!ls datos?
datos1
Se o que queremos é que tenha três números, então temos que colocar três pontos de interrogação ???
!ls datos???
datos123
Maiúsculas [[:upper:]]
Se queremos que procure os arquivos que comecem por maiúsculas
!ls [[:upper:]]*
Abc
Minúsculas [[:lower:]]
Para os arquivos que comecem com minúsculas.
!ls [[:lower:]]*
datos1 datos123 dot2.txt dot.txt file.txt index.html
Aulas
Mediante o uso de colchetes podemos criar classes, assim se quisermos buscar os arquivos que comecem com as letras d
ou f
seguido de qualquer caractere
!ls [df]*
datos1 datos123 dot2.txt dot.txt file.txt
Redirecionamentos: como funciona o shell
Um comando funciona da seguinte maneira
Tem um standard input
, que por padrão é o texto que introduzimos pelo teclado, um standard output
, que por padrão é o texto que sai pelo console e um standard error
que também é por padrão um texto que sai pelo console, mas que tem outro formato
Redirecionando a standard output
Mas com o caractere >
podemos modificar o standard output
de um comando. Por exemplo, se queremos listar com ls
os arquivos da pasta em que estamos, mas não queremos que o resultado seja impresso na tela, e sim que seja salvo em um arquivo, faríamos o seguinte ls > lista.txt
, isso escreve a lista em lista.txt
, além disso, se lista.txt
não existir, ele o cria.
!ls > lista.txt
Vemos que criou o arquivo e vemos o que há dentro
!ls > lista.txtterminal("ls")
2021-02-11-Introduccion-a-Python.ipynbAbcdatos1datos123dot2.txtdot.txtfile.txtindex.htmllista.txt
terminal("cat lista.txt")
2021-02-11-Introduccion-a-Python.ipynbAbcdatos1datos123dot2.txtdot.txtfile.txtindex.htmllista.txt
Vemos que dentro de lista.txt
aparece lista.txt
, isso é porque primeiro cria o arquivo e depois executa o comando
Fazemos o mesmo, mas com a pasta pai
!ls ../ > lista.txt
Se voltarmos a ver dentro de lista.txt
!ls ../ > lista.txtterminal("cat lista.txt")
2021-02-11-Introduccion-a-Python.ipynb2021-04-23-Calculo-matricial-con-Numpy.ipynb2021-06-15-Manejo-de-datos-con-Pandas.ipynb2022-09-12 Introduccion a la terminal.ipynb2022-09-12 Introduccion a la terminal.txtcommand-line-cheat-sheet.pdfCSS.ipynbDocker.htmlDocker.ipynbExpresiones regulares.htmlExpresiones regulares.ipynbhtml_fileshtml.ipynbintroduccion_pythonmovies.csvmovies.datnotebooks_translatedprueba__pycache__ssh.ipynbtest.htmltest.ipynb
Vemos que o conteúdo é sobrescrito
Se o que queremos é que o conteúdo seja concatenado, devemos usar >>
!ls > lista.txt
!ls > lista.txt!ls ../ >> lista.txt
!ls > lista.txt!ls ../ >> lista.txtterminal("cat lista.txt")
2021-02-11-Introduccion-a-Python.ipynbAbcdatos1datos123dot2.txtdot.txtfile.txtindex.htmllista.txt2021-02-11-Introduccion-a-Python.ipynb2021-04-23-Calculo-matricial-con-Numpy.ipynb2021-06-15-Manejo-de-datos-con-Pandas.ipynb2022-09-12 Introduccion a la terminal.ipynb2022-09-12 Introduccion a la terminal.txtcommand-line-cheat-sheet.pdfCSS.ipynbDocker.htmlDocker.ipynbExpresiones regulares.htmlExpresiones regulares.ipynbhtml_fileshtml.ipynbintroduccion_pythonmovies.csvmovies.datnotebooks_translatedprueba__pycache__ssh.ipynbtest.htmltest.ipynb
Agora sim a informação foi concatenada
Isso é muito útil para criar arquivos de log
Redirecionamento do standard error
Se realizarmos uma operação incorreta obtemos um erro, vejamos o que acontece ao redirecionar um comando que dá um erro
!ls fjhdsalkfs > lista.txt
ls: no se puede acceder a 'fjhdsalkfs': No existe el archivo o el directorio
Como vemos, ocorreu um erro, mas se agora verificarmos dentro de lista.txt
terminal("cat lista.txt")
Vemos que o arquivo está vazio, isso é porque não redirecionamos o standard error
para lista.txt
, mas sim o standard output
. Como vimos na imagem, há dois standards de saída em um comando, o primeiro é o standard output
e o segundo é o standard error
, portanto, para redirecionar o standard error, precisamos indicá-lo através de 2>
. Vamos agora assim
!ls kjhsfskjd 2> lista.txt
!ls kjhsfskjd 2> lista.txtterminal("cat lista.txt")
ls: no se puede acceder a 'kjhsfskjd': No existe el archivo o el directorio
Como vemos agora sim foi redirecionado
Redirecionamento do standard output
e do standard error
Se quisermos redirecionar ambos usamos o seguinte
!ls kjhsfskjd > lista.txt 2>&1
Vamos ver dentro de lista.txt
!ls kjhsfskjd > lista.txt 2>&1terminal("cat lista.txt")
ls: no se puede acceder a 'kjhsfskjd': No existe el archivo o el directorio
Se agora executarmos um comando sem erros
!ls . >> lista.txt 2>&1
Vejamos dentro de lista.txt
(atenção, agora concatenamos)
!ls . >> lista.txt 2>&1terminal("cat lista.txt")
ls: no se puede acceder a 'kjhsfskjd': No existe el archivo o el directorio2021-02-11-Introduccion-a-Python.ipynbAbcdatos1datos123dot2.txtdot.txtfile.txtindex.htmllista.txt
Como se pode ver, foram redirecionados, tanto o standard error
, quanto o standard output
para o mesmo arquivo.
Pipelines
Podemos criar pipelines fazendo com que a standard output
de um comando se torne a standard input
de outro. Por exemplo, vamos fazer com que a saída de ls -lha
seja a entrada de grep
, que veremos mais adiante, mas é um comando para buscar.
!ls -lha | grep -i "txt"
-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot2.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 file.txt-rw-rw-r-- 1 wallabot wallabot 182 dic 6 01:06 lista.txt
Como podemos ver, o que fizemos foi direcionar a saída de ls
para grep
com o qual procuramos por algum arquivo com txt
no nome.
Operadores de controle - encadear comandos
Comandos de maneira sequencial
Uma forma de encadear comandos de forma sequencial é separá-los através de ;
. Isso cria diferentes threads para cada tarefa
!ls; echo 'Hola'; cal
2021-02-11-Introduccion-a-Python.ipynb datos123 file.txtAbc dot2.txt index.htmldatos1 dot.txt lista.txtHolaDiciembre 2022do lu ma mi ju vi sá1 2 34 5 6 7 8 9 1011 12 13 14 15 16 1718 19 20 21 22 23 2425 26 27 28 29 30 31
Como podemos ver, primeiro foi executado o comando ls
, depois foi impresso "Olá" graças ao comando echo "Olá"
e por último foi impresso um calendário graças ao comando cal
content_filter_results: {'hate': {'filtered': False, 'severity': 'safe'}, 'self_harm': {'filtered': False, 'severity': 'safe'}, 'sexual': {'filtered': False, 'severity': 'safe'}, 'violence': {'filtered': True, 'severity': 'medium'}} message_content: None
!echo "Before touch;"; ls -lha; touch secuential.txt; echo "After touch:"; ls -lha
Before touch;total 292Kdrwxrwxr-x 2 wallabot wallabot 4,0K dic 6 01:04 .drwxrwxr-x 7 wallabot wallabot 4,0K dic 6 00:24 ..-rw-rw-r-- 1 wallabot wallabot 280K dic 6 00:28 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 Abc-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos1-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos123-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot2.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 file.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 index.html-rw-rw-r-- 1 wallabot wallabot 182 dic 6 01:06 lista.txtAfter touch:total 292Kdrwxrwxr-x 2 wallabot wallabot 4,0K dic 6 01:07 .drwxrwxr-x 7 wallabot wallabot 4,0K dic 6 00:24 ..-rw-rw-r-- 1 wallabot wallabot 280K dic 6 00:28 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 Abc-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos1-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos123-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot2.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 file.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 index.html-rw-rw-r-- 1 wallabot wallabot 182 dic 6 01:06 lista.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 01:07 secuential.txt
Como você pode ver, no primeiro ls
não aparece secuential.txt
, enquanto que no segundo sim. Isso quer dizer que os comandos foram executados em ordem, um atrás do outro.
Comandos em paralelo
Se o que queremos é que os comandos sejam executados de maneira paralela, é preciso usar o operador &
, isso fará com que seja criado um novo processo para cada comando
Vamos ver o exemplo de antes
!rm secuential.txt
!rm secuential.txt!echo "Before touch;" & ls -lha & touch secuential.txt & echo "After touch:" & ls -lha
Before touch;After touch:total 292Kdrwxrwxr-x 2 wallabot wallabot 4,0K dic 6 01:08 .drwxrwxr-x 7 wallabot wallabot 4,0K dic 6 00:24 ..-rw-rw-r-- 1 wallabot wallabot 280K dic 6 00:28 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 Abc-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos1-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos123-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot2.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 file.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 index.html-rw-rw-r-- 1 wallabot wallabot 182 dic 6 01:06 lista.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 01:08 secuential.txt
502
Comandos de maneira condicional
E
Utilizando o operador &&
, um comando será executado quando o anterior tiver sido executado com sucesso.
!rm secuential.txt
!rm secuential.txt!echo "Before touch;" && ls -lha && touch secuential.txt && echo "After touch:" && ls -lha
Before touch;total 292Kdrwxrwxr-x 2 wallabot wallabot 4,0K dic 6 01:08 .drwxrwxr-x 7 wallabot wallabot 4,0K dic 6 00:24 ..-rw-rw-r-- 1 wallabot wallabot 280K dic 6 00:28 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 Abc-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos1-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos123-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot2.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 file.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 index.html-rw-rw-r-- 1 wallabot wallabot 182 dic 6 01:06 lista.txtAfter touch:total 292Kdrwxrwxr-x 2 wallabot wallabot 4,0K dic 6 01:08 .drwxrwxr-x 7 wallabot wallabot 4,0K dic 6 00:24 ..-rw-rw-r-- 1 wallabot wallabot 280K dic 6 00:28 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 Abc-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos1-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos123-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot2.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 file.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 index.html-rw-rw-r-- 1 wallabot wallabot 182 dic 6 01:06 lista.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 01:08 secuential.txt
Aqui podemos ver como foi executado um atrás do outro, ou seja, um comando não começa até que o anterior termine.
Mas então, qual é a diferença entre ;
e &&
?
No primeiro, o sequencial ;
, primeiro é executado um comando e depois outro, mas para que seja executado um comando não importa que o anterior tenha sido executado satisfatoriamente
!rm prueba ; ls -lha
rm: no se puede borrar 'prueba': No existe el archivo o el directoriototal 292Kdrwxrwxr-x 2 wallabot wallabot 4,0K dic 6 01:08 .drwxrwxr-x 7 wallabot wallabot 4,0K dic 6 00:24 ..-rw-rw-r-- 1 wallabot wallabot 280K dic 6 00:28 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 Abc-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos1-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos123-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot2.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 file.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 index.html-rw-rw-r-- 1 wallabot wallabot 182 dic 6 01:06 lista.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 01:08 secuential.txt
Como se pode ver, primeiro se executa rm teste
, dá um erro e ainda assim se executa ls -lha teste
Na maneira condicional &&
, se um comando não for executado satisfatoriamente, o próximo não será executado.
!rm prueba && ls -lha
rm: no se puede borrar 'prueba': No existe el archivo o el directorio
Como se pode ver ls -lha prova
não é executado pois rm prova
deu um erro
Ou
Ao contrário do &&
, o 'or' executará todos os processos independentemente do seu resultado. Deve-se utilizar o operador ||
!rm prueba || ls -lha
rm: no se puede borrar 'prueba': No existe el archivo o el directoriototal 292Kdrwxrwxr-x 2 wallabot wallabot 4,0K dic 6 01:08 .drwxrwxr-x 7 wallabot wallabot 4,0K dic 6 00:24 ..-rw-rw-r-- 1 wallabot wallabot 280K dic 6 00:28 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 Abc-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos1-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos123-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot2.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 file.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 index.html-rw-rw-r-- 1 wallabot wallabot 182 dic 6 01:06 lista.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 01:08 secuential.txt
A diferença entre este e ;
é que o ||
(or) não cria um novo thread para cada comando
Como lidar com as permissões
Quando se listam os arquivos de um diretório com a flag -l
(long) aparecem alguns símbolos ao lado de cada arquivo.
!mkdir subdirectorio
!mkdir subdirectorio!ls -l
total 288-rw-rw-r-- 1 wallabot wallabot 285898 dic 6 00:28 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 Abc-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos1-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos123-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot2.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 file.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 index.html-rw-rw-r-- 1 wallabot wallabot 182 dic 6 01:06 lista.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 01:08 secuential.txtdrwxrwxr-x 2 wallabot wallabot 4096 dic 6 01:10 subdirectorio
Isso nos dá informações de cada arquivo
Primeiro vejamos quais tipos de arquivos existem * -: Arquivo normal * d: Diretório* l: Link simbólico* b: Arquivo de bloco especial. São arquivos que manipulam as informações dos blocos de dados como, por exemplo, um USB
Depois veremos os tipos de modo:
```markdownProprietário | Grupo | Mundo | ||||||
---|---|---|---|---|---|---|---|---|
rwx | r-x | r-x | ||||||
1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 |
7 | 5 | 5 |
Modo simbólico: * u: Apenas para o usuário* g: Apenas para o grupo* o: Apenas para outros (world)* a: Para todos
Modificando as permissões no terminal
Criamos um novo arquivo
terminal("cd subdirectorio")
terminal("cd subdirectorio")!echo "hola mundo" > mitexto.txt
terminal("cd subdirectorio")!echo "hola mundo" > mitexto.txt!cat mitexto.txt
hola mundo
Vamos ver as permissões que ele tem.
!ls -l
total 4-rw-rw-r-- 1 wallabot wallabot 11 dic 6 01:10 mitexto.txt
Como vemos, tem permissões de leitura e escrita para o meu usuário e o grupo, e apenas permissões de leitura para o restante (world)
Mudança de permissões com chmod
(change mode)
Para alterar as permissões de um arquivo, usamos o comando chmod
(change mode), onde temos que colocar em octal as permissões do usuário, em seguida as do grupo e por último as dos outros.
!chmod 755 mitexto.txt
!chmod 755 mitexto.txt!ls -l
total 4-rwxr-xr-x 1 wallabot wallabot 11 dic 6 01:10 mitexto.txt
Vemos que agora meu usuário tem permissões de leitura, escrita e execução, enquanto que o grupo e o restante do mundo têm permissões de leitura e execução
Vamos remover as permissões de leitura apenas do meu usuário. Para alterar apenas as permissões de um usuário usamos o identificador simbólico, um +
se quisermos adicionar permissões ou um -
se quisermos removê-las ou um =
se quisermos restaurá-las e seguido do tipo de permissão
!chmod u-r mitexto.txt
!chmod u-r mitexto.txt!ls -l
total 4--wxr-xr-x 1 wallabot wallabot 11 dic 6 01:10 mitexto.txt
!cat mitexto.txt
cat: mitexto.txt: Permiso denegado
Como vemos, ao retirar permissões de leitura para o meu usuário, não podemos ler o arquivo.
Vamos conceder novamente a permissão de leitura
!chmod u+r mitexto.txt
!chmod u+r mitexto.txt!ls -l
total 4-rwxr-xr-x 1 wallabot wallabot 11 dic 6 01:10 mitexto.txt
!cat mitexto.txt
hola mundo
Se quisermos adicionar ou remover permissões para mais de um usuário, fazemos isso separando cada permissão por uma ,
!chmod u-x,go=w mitexto.txt
!chmod u-x,go=w mitexto.txt!ls -l
total 4-rw--w--w- 1 wallabot wallabot 11 dic 6 01:10 mitexto.txt
Como se pode ver, foi removida a permissão de execução do usuário e foi estabelecida a permissão de escrita apenas para o grupo e o resto do mundo.
Identificação do usuário com whoami
Para saber quem somos podemos usar o comando whoami
(who am I)
!whoami
wallabot
Informações do usuário com id
Outra maneira, que além disso fornece mais informações, é o comando id
!id
uid=1000(wallabot) gid=1000(wallabot) grupos=1000(wallabot),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),120(lpadmin),131(lxd),132(sambashare),998(docker)
Este comando nos diz que nosso ID de usuário é 1000, o ID de grupo é 1000 e que pertencemos aos grupos wallabot, adm, cdrom, sudo, dip, plugdev, lpadmin, lxd, sambashare e docker
Mudança de usuário com o comando su
(switch user)
Se queremos mudar de usuário, usamos o comando su
(switch user). Para certos usuários, é necessário usar sudo
(superuser do).
!sudo su root
root@wallabot:/home/wallabot/Documentos/web/portafolio/posts/prueba/subdirectorio#
Como vemos muda o prompt
e agora indica que somos o usuário root
.
Vamos para a pasta home
!cd
root@wallabot:~#
Mas no Linux há uma pasta home para cada usuário, isso podemos ver se executarmos o comando pwd
!pwd
/root
Vou criar um arquivo na pasta onde antes criei o arquivo mitexto.txt
!touch /home/wallabot/Documentos/web/portafolio/posts/prueba/subdirectorio/rootfile.txt
Vuelvo a mudar para o meu usuário
!su wallabot
wallabot@wallabot:
E vou para o diretório onde estão os arquivos que criei.
!cd /home/wallabot/Documentos/web/portafolio/posts/prueba/subdirectorio
Vemos os arquivos que existem e suas permissões
!cd /home/wallabot/Documentos/web/portafolio/posts/prueba/subdirectorio!ls -l
total 4-rw--w--w- 1 wallabot wallabot 11 dic 6 01:10 mitexto.txt-rw-r--r-- 1 root root 0 dic 6 01:22 rootfile.txt
Como vemos, o usuário e o grupo do arquivo rootfile.txt é o usuário root
Se eu, agora que sou o usuário wallabot, tentar apagar o arquivo rootfile.txt
!rm rootfile.txt
rm: ¿borrar el fichero regular vacío 'rootfile.txt' protegido contra escritura? (s/n)
Como vemos, ele nos pergunta se queremos excluí-lo, já que pertence a outro usuário.
Modificar a senha de um usuário
Se quiser modificar a senha do usuário que está atualmente ativo, use o comando passwd
(password)
Primeiro verifico que usuário sou
!whoami
wallabot
E agora tentamos mudar a senha
!passwd
$ passwdCambiando la contraseña de wallabot.Contraseña actual de :Nueva contraseña:Vuelva a escribir la nueva contraseña
Como vemos, pede a senha atual para poder alterá-la.
Links simbólicos
Podemos criar links simbólicos para um caminho determinado usando o comando ln
(link) seguido da flag -s
(simbólico), o diretório e o nome do link
!ln -s /home/wallabot/Documentos/web web
Se agora listarmos os arquivos
!ln -s /home/wallabot/Documentos/web web!ls -l
total 4-rw--w--w- 1 wallabot wallabot 11 dic 6 01:10 mitexto.txt-rw-r--r-- 1 root root 0 dic 6 01:22 rootfile.txtlrwxrwxrwx 1 wallabot wallabot 29 dic 6 01:28 web -> /home/wallabot/Documentos/web
Vemos o link simbólico web
que aponta para /home/wallabot/Documentos/web:
Eu agora posso ir para web
terminal("cd web")
terminal("cd web")!pwd
/home/wallabot/Documentos/web
Configurar as variáveis de ambiente
Ver as variáveis de ambiente com printenv
Com o comando printenv
podemos ver todas as variáveis de ambiente
!printenv
GJS_DEBUG_TOPICS=JS ERROR;JS LOGVSCODE_CWD=/home/wallabotLESSOPEN=| /usr/bin/lesspipe %sCONDA_PROMPT_MODIFIER=(base)PYTHONIOENCODING=utf-8USER=wallabotVSCODE_NLS_CONFIG={"locale":"es","availableLanguages":{"*":"es"},"_languagePackId":"b07c40c9acb9e1d7b3ca14b06f814803.es","_translationsConfigFile":"/home/wallabot/.config/Code/clp/b07c40c9acb9e1d7b3ca14b06f814803.es/tcf.json","_cacheRoot":"/home/wallabot/.config/Code/clp/b07c40c9acb9e1d7b3ca14b06f814803.es","_resolvedLanguagePackCoreLocation":"/home/wallabot/.config/Code/clp/b07c40c9acb9e1d7b3ca14b06f814803.es/6261075646f055b99068d3688932416f2346dd3b","_corruptedFile":"/home/wallabot/.config/Code/clp/b07c40c9acb9e1d7b3ca14b06f814803.es/corrupted.info","_languagePackSupport":true}VSCODE_HANDLES_UNCAUGHT_ERRORS=trueMPLBACKEND=module://ipykernel.pylab.backend_inlineSSH_AGENT_PID=1373XDG_SESSION_TYPE=x11SHLVL=0HOME=/home/wallabotCHROME_DESKTOP=code-url-handler.desktopCONDA_SHLVL=1DESKTOP_SESSION=ubuntuGIO_LAUNCHED_DESKTOP_FILE=/usr/share/applications/code.desktopVSCODE_IPC_HOOK=/run/user/1000/vscode-26527400-1.73.1-main.sockPYTHONUNBUFFERED=1GTK_MODULES=gail:atk-bridgeGNOME_SHELL_SESSION_MODE=ubuntuAPPLICATION_INSIGHTS_NO_DIAGNOSTIC_CHANNEL=truePAGER=catMANAGERPID=1153DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/busGIO_LAUNCHED_DESKTOP_FILE_PID=3897_CE_M=IM_CONFIG_PHASE=1LOGNAME=wallabot_=/home/wallabot/anaconda3/bin/pythonJOURNAL_STREAM=8:52662XDG_SESSION_CLASS=userUSERNAME=wallabotTERM=xterm-colorGNOME_DESKTOP_SESSION_ID=this-is-deprecated_CE_CONDA=WINDOWPATH=2PATH=/home/wallabot/anaconda3/bin:/home/wallabot/anaconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/binSESSION_MANAGER=local/wallabot:@/tmp/.ICE-unix/1410,unix/wallabot:/tmp/.ICE-unix/1410INVOCATION_ID=73bba2d15f2e492fa6c16538996a2556VSCODE_AMD_ENTRYPOINT=vs/workbench/api/node/extensionHostProcessXDG_RUNTIME_DIR=/run/user/1000XDG_MENU_PREFIX=gnome-GDK_BACKEND=x11DISPLAY=:0LANG=es_ES.UTF-8XDG_CURRENT_DESKTOP=UnityXAUTHORITY=/run/user/1000/gdm/XauthorityXDG_SESSION_DESKTOP=ubuntuXMODIFIERS=@im=ibusLS_COLORS=SSH_AUTH_SOCK=/run/user/1000/keyring/sshORIGINAL_XDG_CURRENT_DESKTOP=ubuntu:GNOMECONDA_PYTHON_EXE=/home/wallabot/anaconda3/bin/pythonSHELL=/bin/bashELECTRON_RUN_AS_NODE=1QT_ACCESSIBILITY=1GDMSESSION=ubuntuLESSCLOSE=/usr/bin/lesspipe %s %sCONDA_DEFAULT_ENV=basePYDEVD_IPYTHON_COMPATIBLE_DEBUGGING=1GPG_AGENT_INFO=/run/user/1000/gnupg/S.gpg-agent:0:1GJS_DEBUG_OUTPUT=stderrQT_IM_MODULE=ibusGIT_PAGER=catPWD=/home/wallabot/Documentos/webCLICOLOR=1XDG_DATA_DIRS=/usr/share/ubuntu:/usr/local/share/:/usr/share/:/var/lib/snapd/desktopXDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdgVSCODE_CODE_CACHE_PATH=/home/wallabot/.config/Code/CachedData/6261075646f055b99068d3688932416f2346dd3bCONDA_EXE=/home/wallabot/anaconda3/bin/condaCONDA_PREFIX=/home/wallabot/anaconda3VSCODE_PID=3897
Visualizar uma variável de ambiente com o comando echo
Para ver uma variável de ambiente em concreto podemos fazê-lo através do comando echo
seguido do símbolo $
e o nome da variável
!echo $HOME
/home/wallabot
Modificar uma variável de ambiente para uma sessão de terminal
Podemos modificar uma variável de ambiente para a sessão ativa do terminal, por exemplo, vamos adicionar um novo caminho à variável PATH
. Primeiro, vamos ver o que há nela
!echo $PATH
/home/wallabot/anaconda3/bin:/home/wallabot/anaconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Agora adicionamos um novo diretório
!PATH=$PATH:"subdirectorio
Voltamos a ver o que há dentro de PATH
!echo $PATH
/home/wallabot/anaconda3/bin:/home/wallabot/anaconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:subdirectorio
Vemos que o diretório subdiretório
foi adicionado.
O problema deste método é que quando abrirmos um novo terminal esse ajuste no PATH
não será mantido.
Modificar uma variável de ambiente para todas as sessões de terminal
Vamos para a pasta home
terminal("cd /home/wallabot")
Aqui no home listamos todos os arquivos com o flag -a
(all)
terminal("cd /home/wallabot")!ls -a
. .eclipse .pki.. Escritorio Plantillas.afirma .gitconfig .platformioanaconda3 .gnupg .profile.audacity-data Imágenes .psensor.bash_history .ipython Público.bash_logout .java .python_history.bashrc .jupyter snap.cache .lesshst .ssh.conda Lightworks .sudo_as_admin_successful.config .Lightworks.thereCanBeOnlyOne .thunderbird.cortex-debug .local Vídeos.cyberghost logiops .vnc.dbus .MCTranscodingSDK .vscodeDescargas .mozilla .wget-hsts.docker MúsicaDocumentos .nv
Vemos que há um arquivo que se chama .bashrc
, este arquivo é o arquivo que tem a configuração do nosso bash
terminal("cat .bashrc", max_lines_output=3)
# ~/.bashrc: executed by bash(1) for non-login shells.# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)# for examples...fiunset __conda_setup# <<< conda initialize <<<
Este arquivo é o que configura o terminal cada vez que uma nova é aberta, portanto, se editarmos a variável PATH
nele, essa alteração será mantida para todas as novas janelas de terminal que abrirmos.
Para modificar a variável PATH
dentro do arquivo de configuração, precisamos adicionar a seguinte linha ao arquivo
```PATH=$PATH:"subdiretório"```
Criar alias para todas as sessões
Já vimos como criar alias de comandos, mas também acontecia que eles se perdiam sempre que fechávamos uma sessão do terminal. Para que isso não aconteça, nós os adicionamos também ao arquivo de configuração .bashrc
. Por exemplo, no meu caso, adicionei as seguintes linhas
alias ll='ls -l'alias la='ls -a'alias lh='ls -h'alias lha='ls -lha'
Comandos de busca
Busca de binários com which
O primeiro comando de busca que vamos ver é which
que nos permite encontrar o caminho dos binários
!which python
/home/wallabot/anaconda3/bin/python
No entanto, se procurarmos algo que não esteja em alguma das rotas do PATH, which
não será capaz de nos dizer a rota
!which cd
Busca de arquivos com find
Para buscar um arquivo com find, temos que indicar a partir de qual caminho queremos buscar o arquivo, seguido da flag -name
e o nome do arquivo que queremos buscar.
!which cd!find ~ -name "2021-02-11-Introduccion-a-Python.ipynb"
/home/wallabot/Documentos/web/portafolio/posts/prueba/2021-02-11-Introduccion-a-Python.ipynb/home/wallabot/Documentos/web/portafolio/posts/2021-02-11-Introduccion-a-Python.ipynb
Como vemos, está no seu diretório mais a cópia que eu criei neste notebook e a guardei na pasta prueba
Uma coisa muito poderosa do find
é que podemos usar wildcards
, por exemplo, se eu quiser buscar todos os arquivos de texto da minha pasta web
.
!find ~/Documentos/web/ -name *.txt
/home/wallabot/Documentos/web/portafolio/posts/2022-09-12 Introduccion a la terminal.txt/home/wallabot/Documentos/web/portafolio/posts/prueba/lista.txt/home/wallabot/Documentos/web/portafolio/posts/prueba/dot.txt/home/wallabot/Documentos/web/portafolio/posts/prueba/dot2.txt/home/wallabot/Documentos/web/portafolio/posts/prueba/secuential.txt/home/wallabot/Documentos/web/portafolio/posts/prueba/subdirectorio/rootfile.txt/home/wallabot/Documentos/web/portafolio/posts/prueba/subdirectorio/mitexto.txt/home/wallabot/Documentos/web/portafolio/posts/prueba/file.txt/home/wallabot/Documentos/web/wordpress_api_rest/page.txt
Se não quisermos que distingua entre maiúsculas e minúsculas, devemos usar a flag -iname
, por exemplo, se procurarmos todos os arquivos que contenham o texto FILE
, mas usando a flag -iname
!find ~/Documentos/web/ -iname *FILE*
/home/wallabot/Documentos/web/portafolio/posts/html_files/home/wallabot/Documentos/web/portafolio/posts/prueba/subdirectorio/rootfile.txt/home/wallabot/Documentos/web/portafolio/posts/prueba/file.txt
Vemos que todos os resultados contêm file
e não FILE
, ou seja, não fez distinção entre maiúsculas e minúsculas.
Podemos especificar o tipo de arquivo com o flag -type
. Apenas aceita dois tipos f
para arquivos e d
para diretórios
!find ~/Documentos/nerf -name image*
/home/wallabot/Documentos/nerf/instant-ngp/configs/image/home/wallabot/Documentos/nerf/instant-ngp/dependencies/tiny-cuda-nn/benchmarks/image/home/wallabot/Documentos/nerf/instant-ngp/dependencies/tiny-cuda-nn/dependencies/cutlass/media/images/home/wallabot/Documentos/nerf/instant-ngp/dependencies/tiny-cuda-nn/dependencies/fmt/doc/bootstrap/mixins/image.less/home/wallabot/Documentos/nerf/instant-ngp/dependencies/tiny-cuda-nn/data/images/home/wallabot/Documentos/nerf/instant-ngp/dependencies/dlss/NVIDIAImageScaling/samples/media/images/home/wallabot/Documentos/nerf/instant-ngp/data/nerf/fox/images/home/wallabot/Documentos/nerf/instant-ngp/data/image
!find ~/Documentos/nerf -name image* -type d
/home/wallabot/Documentos/nerf/instant-ngp/configs/image/home/wallabot/Documentos/nerf/instant-ngp/dependencies/tiny-cuda-nn/benchmarks/image/home/wallabot/Documentos/nerf/instant-ngp/dependencies/tiny-cuda-nn/dependencies/cutlass/media/images/home/wallabot/Documentos/nerf/instant-ngp/dependencies/tiny-cuda-nn/data/images/home/wallabot/Documentos/nerf/instant-ngp/dependencies/dlss/NVIDIAImageScaling/samples/media/images/home/wallabot/Documentos/nerf/instant-ngp/data/nerf/fox/images/home/wallabot/Documentos/nerf/instant-ngp/data/image
!find ~/Documentos/nerf -name image* -type f
/home/wallabot/Documentos/nerf/instant-ngp/dependencies/tiny-cuda-nn/dependencies/fmt/doc/bootstrap/mixins/image.less
Se queremos filtrar pelo tamanho do arquivo podemos usar a flag -size
, por exemplo, se queremos procurar todos os arquivos de mais de 200 MB
!find ~/Documentos/ -type f -size +200M
/home/wallabot/Documentos/kaggle/hubmap/models/13_efficientnet-b7_final_model.pth/home/wallabot/Documentos/kaggle/hubmap/models/12_efficientnet-b7_final_model.pth/home/wallabot/Documentos/kaggle/hubmap/models/14_resnet152_final_model.pth/home/wallabot/Documentos/kaggle/hubmap/models/14_resnet152_best_model.pth/home/wallabot/Documentos/kaggle/hubmap/models/12_efficientnet-b7_early_stopping.pth/home/wallabot/Documentos/kaggle/hubmap/models/efficientnet-b7-dcc49843.pth/home/wallabot/Documentos/kaggle/hubmap/models/13_efficientnet-b7_early_stopping.pth/home/wallabot/Documentos/kaggle/hubmap/models/14_resnet152_early_stopping.pth/home/wallabot/Documentos/kaggle/hubmap/models/12_efficientnet-b7_best_model.pth/home/wallabot/Documentos/kaggle/hubmap/models/13_efficientnet-b7_best_model.pth
Se queremos realizar operações após a busca, usamos a flag -exec
Por exemplo, vou buscar todas as pastas com o nome subdirectorio
!find ~/ -name subdirectorio -type d
/home/wallabot/Documentos/web/portafolio/posts/prueba/subdirectorio
Posso fazer com que sejam apagados com o flag -exec
!find ~/ -name subdirectorio -type d -exec rm -r {} ;
rm: ¿borrar el fichero regular vacío '/home/wallabot/Documentos/web/portafolio/posts/prueba/subdirectorio/rootfile.txt' protegido contra escritura? (s/n) sfind: ‘/home/wallabot/Documentos/web/portafolio/posts/prueba/subdirectorio’: No existe el archivo o el directorio
!find ~/ -name subdirectorio -type d
Por último, se usarmos o caractere !
estaremos indicando que encontre tudo o que não coincide com o que especificamos
!find ~/ -name subdirectorio -type d!find ~/Documentos/web/portafolio/posts/prueba ! -name *.txt
/home/wallabot/Documentos/web/portafolio/posts/prueba/home/wallabot/Documentos/web/portafolio/posts/prueba/index.html/home/wallabot/Documentos/web/portafolio/posts/prueba/Abc/home/wallabot/Documentos/web/portafolio/posts/prueba/datos1/home/wallabot/Documentos/web/portafolio/posts/prueba/2021-02-11-Introduccion-a-Python.ipynb/home/wallabot/Documentos/web/portafolio/posts/prueba/datos123
Como vemos, ele encontrou tudo o que não é um .txt
Comando de busca grep
grep
é um comando de busca muito poderoso, por isso dedicamos uma seção apenas para ele. O comando grep
utiliza expressões regulares, então se você quiser aprender sobre elas, deixo um link para um post onde as explico.
Vamos começar a ver a potência deste comando, vamos procurar todas as vezes que aparece o texto MaximoFN
dentro do arquivo 2021-02-11-Introduccion-a-Python.ipynb
terminal("cd /home/wallabot/Documentos/web/portafolio/posts/prueba")
terminal("cd /home/wallabot/Documentos/web/portafolio/posts/prueba")terminal("grep MaximoFN 2021-02-11-Introduccion-a-Python.ipynb", max_lines_output=20)
"a = 'MaximoFN' ","'MaximoFN'""string = "MaximoFN" ","'MaximoFN'""string = 'MaximoFN' ","'MaximoFN'""Este es el blog de "MaximoFN" ""print("Este es el blog de \"MaximoFN\"")""Este es el blog de 'MaximoFN' ""print('Este es el blog de \'MaximoFN\'')""Este es el blog de \MaximoFN\\n""print('Este es el blog de \\MaximoFN\\\')""MaximoFN ""print('Este es el blog de \nMaximoFN')""Este es el blog de MaximoFN ""print('Esto no se imprimirá \rEste es el blog de MaximoFN')""Este es el blog de MaximoFN ""print('Este es el blog de \tMaximoFN')""Este es el blog deMaximoFN ""print('Este es el blog de \bMaximoFN')"..."funcion2_del_modulo('MaximoFN')""MaximoFN "," print('MaximoFN') "," variable = 'MaximoFN' ",
No entanto, se fizermos a mesma pesquisa para o texto maximofn
!grep maximofn 2021-02-11-Introduccion-a-Python.ipynb
Não aparece nenhum resultado, isto é porque grep
é case sensitive
, ou seja, busca o texto tal qual foi introduzido, diferenciando maiúsculas e minúsculas. Se não queremos isso, temos que introduzir o flag -i
.
!grep maximofn 2021-02-11-Introduccion-a-Python.ipynbterminal("grep -i MaximoFN 2021-02-11-Introduccion-a-Python.ipynb", max_lines_output=20)
"a = 'MaximoFN' ","'MaximoFN'""string = "MaximoFN" ","'MaximoFN'""string = 'MaximoFN' ","'MaximoFN'""Este es el blog de "MaximoFN" ""print("Este es el blog de \"MaximoFN\"")""Este es el blog de 'MaximoFN' ""print('Este es el blog de \'MaximoFN\'')""Este es el blog de \MaximoFN\\n""print('Este es el blog de \\MaximoFN\\\')""MaximoFN ""print('Este es el blog de \nMaximoFN')""Este es el blog de MaximoFN ""print('Esto no se imprimirá \rEste es el blog de MaximoFN')""Este es el blog de MaximoFN ""print('Este es el blog de \tMaximoFN')""Este es el blog deMaximoFN ""print('Este es el blog de \bMaximoFN')"..."funcion2_del_modulo('MaximoFN')""MaximoFN "," print('MaximoFN') "," variable = 'MaximoFN' ",
Se o que queremos é que ele nos devolva o número de vezes que aparece, introduzimos a flag -c
!grep -c MaximoFN 2021-02-11-Introduccion-a-Python.ipynb
105
Se não nos importarmos se aparecer em maiúsculas ou minúsculas, podemos adicionar novamente a flag -i
, mas não é necessário colocá-la separadamente da flag -c
, elas podem ser inseridas juntas.
!grep -ci MaximoFN 2021-02-11-Introduccion-a-Python.ipynb
105
Se agora queremos todas as vezes em que não aparece a palavra MáximoFN
, introduzimos a flag -v
!grep -cv MaximoFN 2021-02-11-Introduccion-a-Python.ipynb
11573
Utilidades de rede
Informações das interfaces de rede com ifconfig
O primeiro comando será ifconfig
que nos mostra informações das nossas interfaces de rede.
!ifconfig
br-470e52ae2708: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500inet 172.18.0.1 netmask 255.255.0.0 broadcast 172.18.255.255ether 02:42:ac:d0:b9:eb txqueuelen 0 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255ether 02:42:5d:15:1c:e9 txqueuelen 0 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0enp6s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.1.144 netmask 255.255.255.0 broadcast 192.168.1.255inet6 fe80::7dc2:6944:3fbe:c18e prefixlen 64 scopeid 0x20<link>ether 24:4b:fe:5c:f6:59 txqueuelen 1000 (Ethernet)RX packets 144369 bytes 123807349 (123.8 MB)RX errors 0 dropped 2056 overruns 0 frame 0TX packets 100672 bytes 55678042 (55.6 MB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0inet6 ::1 prefixlen 128 scopeid 0x10<host>loop txqueuelen 1000 (Bucle local)RX packets 10748 bytes 1832545 (1.8 MB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 10748 bytes 1832545 (1.8 MB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0wlp5s0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500ether 4c:77:cb:1d:66:cc txqueuelen 1000 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Como vemos, temos a informação de todas as interfaces de rede do meu computador, mas se eu quiser saber apenas a de uma, especifico adicionando seu nome.
!ifconfig enp6s0
enp6s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.1.144 netmask 255.255.255.0 broadcast 192.168.1.255inet6 fe80::7dc2:6944:3fbe:c18e prefixlen 64 scopeid 0x20<link>ether 24:4b:fe:5c:f6:59 txqueuelen 1000 (Ethernet)RX packets 144467 bytes 123842258 (123.8 MB)RX errors 0 dropped 2060 overruns 0 frame 0TX packets 100786 bytes 55749109 (55.7 MB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Informação das interfaces de rede com ip
Outra maneira de obter as informações de nossas interfaces de rede é através do comando ip
, adicionando a
nos dá informações de todas as interfaces
!ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever2: enp6s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 24:4b:fe:5c:f6:59 brd ff:ff:ff:ff:ff:ffinet 192.168.1.144/24 brd 192.168.1.255 scope global dynamic noprefixroute enp6s0valid_lft 80218sec preferred_lft 80218secinet6 fe80::7dc2:6944:3fbe:c18e/64 scope link noprefixroutevalid_lft forever preferred_lft forever3: wlp5s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000link/ether 4c:77:cb:1d:66:cc brd ff:ff:ff:ff:ff:ff4: br-470e52ae2708: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group defaultlink/ether 02:42:ac:d0:b9:eb brd ff:ff:ff:ff:ff:ffinet 172.18.0.1/16 brd 172.18.255.255 scope global br-470e52ae2708valid_lft forever preferred_lft forever5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group defaultlink/ether 02:42:5d:15:1c:e9 brd ff:ff:ff:ff:ff:ffinet 172.17.0.1/16 brd 172.17.255.255 scope global docker0valid_lft forever preferred_lft forever
Teste de comunicações com ping
Outro comando útil é ping
, que pode nos servir para ver se temos conexão com um determinado IP
. Por exemplo, o IP
do Google é 142.250.200.78
, então fazemos ping
para ver se ele nos responde. O comando ping
no Linux faz ping
s sem parar, portanto, nunca termina até que o paremos; para isso não acontecer, adicionamos o flag -c
e o número de tentativas.
!ping 142.250.200.132 -c 4
PING 142.250.200.132 (142.250.200.132) 56(84) bytes of data.64 bytes from 142.250.200.132: icmp_seq=1 ttl=117 time=3.46 ms64 bytes from 142.250.200.132: icmp_seq=2 ttl=117 time=3.77 ms64 bytes from 142.250.200.132: icmp_seq=3 ttl=117 time=2.81 ms64 bytes from 142.250.200.132: icmp_seq=4 ttl=117 time=2.86 ms--- 142.250.200.132 ping statistics ---4 packets transmitted, 4 received, 0% packet loss, time 3004msrtt min/avg/max/mdev = 2.812/3.227/3.773/0.405 ms
O mesmo teria acontecido se tivéssemos feito diretamente sobre google.com
!ping www.google.com -c 4
PING www.google.com (142.250.200.132) 56(84) bytes of data.64 bytes from mad41s14-in-f4.1e100.net (142.250.200.132): icmp_seq=1 ttl=117 time=2.74 ms64 bytes from mad41s14-in-f4.1e100.net (142.250.200.132): icmp_seq=2 ttl=117 time=3.96 ms64 bytes from mad41s14-in-f4.1e100.net (142.250.200.132): icmp_seq=3 ttl=117 time=3.56 ms64 bytes from mad41s14-in-f4.1e100.net (142.250.200.132): icmp_seq=4 ttl=117 time=2.87 ms--- www.google.com ping statistics ---4 packets transmitted, 4 received, 0% packet loss, time 3003msrtt min/avg/max/mdev = 2.741/3.283/3.962/0.499 ms
Baixar arquivos fonte com curl
Podemos obter um arquivo de texto de um endereço dado através do comando curl
, por exemplo, podemos baixar o html do Google
!curl https://www.google.com
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="es"><head><meta content="Google.es permite acceder a la informaci�n mundial en castellano, catal�n, gallego, euskara e ingl�s." name="description"><meta content="noodp" name="robots"><meta content="text/html; charset=UTF-8" http-equiv="Content-Type"><meta content="/images/branding/googleg/1x/googleg_standard_color_128dp.png" itemprop="image"><title>Google</title><script nonce="zXcc4tMJWBRoE7q_o_Z2fQ">(function(){window.google={kEI:'M5GOY6PeLr-jkdUP1pir0AE',kEXPI:'0,1359409,6059,206,4804,2316,383,246,5,5367,1123753,1197713,688,380089,16115,28684,22430,1362,12312,17587,4998,13228,3847,10622,22741,5081,1593,1279,2742,149,1103,840,1983,214,4100,3514,606,2023,2297,14670,3227,2845,7,4773,28997,1850,15757,3,346,230,6459,149,13975,4,1528,2304,7039,27731,7357,13658,4437,16786,5815,2542,4094,4052,3,3541,1,14262,27892,2,14022,6248,19490,5680,1021,2380,28741,4569,6255,23421,1252,5835,14967,4333,7484,11406,15676,8155,7381,15970,873,14804,1,4828,7,1922,5784,12208,10330,587,12192,4832,26504,5796,3,14433,3890,751,13384,1499,3,679,1622,1779,1886,338,1627,1119,6,8909,80,243,458,3438,1763,722,1020,813,91,1133,10,280,2306,44,77,1420,3,562,402,314,275,2095,440,399,138,384,1033,334,2667,2,723,444,79,403,501,929,3,785,2,240,78,2022,284,196,732,175,342,244,617,335,1,841,1275,14,979,57,857,446,2,1900,838,251,227,50,21,8,3,442,57,40,936,697,773,95,121,643,1502,163,355,702,195,1,452,50,334,687,109,1,19,109,134,546,80,5,36,124,68,135,131,415,47,27,266,563,48,231,742,15,527,2,6,495,1,495,5,62,1627,441,262,5,3,648,3,6,4,13,39,538,792,337,9,115,98,180,148,308,401,1240,2,726,243,2044,5286450,84,19,32,115,11,70,5995534,2803414,3311,141,795,19735,1,1,346,1755,1004,41,342,1,189,14,1,10,8,1,5,4,2,1,3,2,2,1,3,1,3,1,4,3,1,3,2,2,23947076,511,21,11,4041599,1964,1007,2087,13579,3102,303,5595,11,3835,3637,2623,9,136,1524825',kBL:'p9Xv'};google.sn='webhp';google.kHL='es';})();(function(){var f=this||self;var h,k=[];function l(a){for(var b;a&&(!a.getAttribute||!(b=a.getAttribute("eid")));)a=a.parentNode;return b||h}function m(a){for(var b=null;a&&(!a.getAttribute||!(b=a.getAttribute("leid")));)a=a.parentNode;return b}function n(a,b,c,d,g){var e="";c||-1!==b.search("&ei=")||(e="&ei="+l(d),-1===b.search("&lei=")&&(d=m(d))&&(e+="&lei="+d));d="";!c&&f._cshid&&-1===b.search("&cshid=")&&"slh"!==a&&(d="&cshid="+f._cshid);c=c||"/"+(g||"gen_204")+"?atyp=i&ct="+a+"&cad="+b+e+"&zx="+Date.now()+d;/^http:/i.test(c)&&"https:"===window.location.protocol&&(google.ml&&google.ml(Error("a"),!1,{src:c,glmm:1}),c="");return c};h=google.kEI;google.getEI=l;google.getLEI=m;google.ml=function(){return null};google.log=function(a,b,c,d,g){if(c=n(a,b,c,d,g)){a=new Image;var e=k.length;k[e]=a;a.onerror=a.onload=a.onabort=function(){delete k[e]};a.src=c}};google.logUrl=n;}).call(this);(function(){google.y={};google.sy=[];google.x=function(a,b){if(a)var c=a.id;else{do c=Math.random();while(google.y[c])}google.y[c]=[a,b];return!1};google.sx=function(a){google.sy.push(a)};google.lm=[];google.plm=function(a){google.lm.push.apply(google.lm,a)};google.lq=[];google.load=function(a,b,c){google.lq.push([[a],b,c])};google.loadAll=function(a,b){google.lq.push([a,b])};google.bx=!1;google.lx=function(){};}).call(this);google.f={};(function(){document.documentElement.addEventListener("submit",function(b){var a;if(a=b.target){var c=a.getAttribute("data-submitfalse");a="1"===c||"q"===c&&!a.elements.q.value?!0:!1}else a=!1;a&&(b.preventDefault(),b.stopPropagation())},!0);document.documentElement.addEventListener("click",function(b){var a;a:{for(a=b.target;a&&a!==document.documentElement;a=a.parentElement)if("A"===a.tagName){a="1"===a.getAttribute("data-nohref");break a}a=!1}a&&b.preventDefault()},!0);}).call(this);</script><style>#gbar,#guser{font-size:13px;padding-top:1px !important;}#gbar{height:22px}#guser{padding-bottom:7px !important;text-align:right}.gbh,.gbd{border-top:1px solid #c9d7f1;font-size:1px}.gbh{height:0;position:absolute;top:24px;width:100%}@media all{.gb1{height:22px;margin-right:.5em;vertical-align:top}#gbar{float:left}}a.gb1,a.gb4{text-decoration:underline !important}a.gb1,a.gb4{color:#00c !important}.gbi .gb4{color:#dd8e27 !important}.gbf .gb4{color:#900 !important}</style><style>body,td,a,p,.h{font-family:arial,sans-serif}body{margin:0;overflow-y:scroll}#gog{padding:3px 8px 0}td{line-height:.8em}.gac_m td{line-height:17px}form{margin-bottom:20px}.h{color:#1558d6}em{font-weight:bold;font-style:normal}.lst{height:25px;width:496px}.gsfi,.lst{font:18px arial,sans-serif}.gsfs{font:17px arial,sans-serif}.ds{display:inline-box;display:inline-block;margin:3px 0 4px;margin-left:4px}input{font-family:inherit}body{background:#fff;color:#000}a{color:#4b11a8;text-decoration:none}a:hover,a:active{text-decoration:underline}.fl a{color:#1558d6}a:visited{color:#4b11a8}.sblc{padding-top:5px}.sblc a{display:block;margin:2px 0;margin-left:13px;font-size:11px}.lsbb{background:#f8f9fa;border:solid 1px;border-color:#dadce0 #70757a #70757a #dadce0;height:30px}.lsbb{display:block}#WqQANb a{display:inline-block;margin:0 12px}.lsb{background:url(/images/nav_logo229.png) 0 -261px repeat-x;border:none;color:#000;cursor:pointer;height:30px;margin:0;outline:0;font:15px arial,sans-serif;vertical-align:top}.lsb:active{background:#dadce0}.lst:focus{outline:none}</style><script nonce="zXcc4tMJWBRoE7q_o_Z2fQ">(function(){window.google.erd={jsr:1,bv:1698,de:true};var h=this||self;var k,l=null!=(k=h.mei)?k:1,n,p=null!=(n=h.sdo)?n:!0,q=0,r,t=google.erd,v=t.jsr;google.ml=function(a,b,d,m,e){e=void 0===e?2:e;b&&(r=a&&a.message);if(google.dl)return google.dl(a,e,d),null;if(0>v){window.console&&console.error(a,d);if(-2===v)throw a;b=!1}else b=!a||!a.message||"Error loading script"===a.message||q>=l&&!m?!1:!0;if(!b)return null;q++;d=d||{};b=encodeURIComponent;var c="/gen_204?atyp=i&ei="+b(google.kEI);google.kEXPI&&(c+="&jexpid="+b(google.kEXPI));c+="&srcpg="+b(google.sn)+"&jsr="+b(t.jsr)+"&bver="+b(t.bv);var f=a.lineNumber;void 0!==f&&(c+="&line="+f);var g=a.fileName;g&&(0<g.indexOf("-extension:/")&&(e=3),c+="&script="+b(g),f&&g===window.location.href&&(f=document.documentElement.outerHTML.split(" ")[f],c+="&cad="+b(f?f.substring(0,300):"No script found.")));c+="&jsel="+e;for(var u in d)c+="&",c+=b(u),c+="=",c+=b(d[u]);c=c+"&emsg="+b(a.name+": "+a.message);c=c+"&jsst="+b(a.stack||"N/A");12288<=c.length&&(c=c.substr(0,12288));a=c;m||google.log(0,"",a);return a};window.onerror=function(a,b,d,m,e){r!==a&&(a=e instanceof Error?e:Error(a),void 0===d||"lineNumber"in a||(a.lineNumber=d),void 0===b||"fileName"in a||(a.fileName=b),google.ml(a,!1,void 0,!1,"SyntaxError"===a.name||"SyntaxError"===a.message.substring(0,11)||-1!==a.message.indexOf("Script error")?3:0));r=null;p&&q>=l&&(window.onerror=null)};})();</script></head><body bgcolor="#fff"><script nonce="zXcc4tMJWBRoE7q_o_Z2fQ">(function(){var src='/images/nav_logo229.png';var iesg=false;document.body.onload = function(){window.n && window.n();if (document.images){new Image().src=src;}if (!iesg){document.f&&document.f.q.focus();document.gbqf&&document.gbqf.q.focus();}}})();</script><div id="mngb"><div id=gbar><nobr><b class=gb1>B�squeda</b> <a class=gb1 href="https://www.google.es/imghp?hl=es&tab=wi">Im�genes</a> <a class=gb1 href="https://maps.google.es/maps?hl=es&tab=wl">Maps</a> <a class=gb1 href="https://play.google.com/?hl=es&tab=w8">Play</a> <a class=gb1 href="https://www.youtube.com/?tab=w1">YouTube</a> <a class=gb1 href="https://news.google.com/?tab=wn">Noticias</a> <a class=gb1 href="https://mail.google.com/mail/?tab=wm">Gmail</a> <a class=gb1 href="https://drive.google.com/?tab=wo">Drive</a> <a class=gb1 style="text-decoration:none" href="https://www.google.es/intl/es/about/products?tab=wh"><u>M�s</u> »</a></nobr></div><div id=guser width=100%><nobr><span id=gbn class=gbi></span><span id=gbf class=gbf></span><span id=gbe></span><a href="http://www.google.es/history/optout?hl=es" class=gb4>Historial web</a> | <a href="/preferences?hl=es" class=gb4>Ajustes</a> | <a target=_top id=gb_70 href="https://accounts.google.com/ServiceLogin?hl=es&passive=true&continue=https://www.google.com/&ec=GAZAAQ" class=gb4>Iniciar sesi�n</a></nobr></div><div class=gbh style=left:0></div><div class=gbh style=right:0></div></div><center><br clear="all" id="lgpd"><div id="lga"><img alt="Google" height="92" src="/images/branding/googlelogo/1x/googlelogo_white_background_color_272x92dp.png" style="padding:28px 0 14px" width="272" id="hplogo"><br><br></div><form action="/search" name="f"><table cellpadding="0" cellspacing="0"><tr valign="top"><td width="25%"> </td><td align="center" nowrap=""><input name="ie" value="ISO-8859-1" type="hidden"><input value="es" name="hl" type="hidden"><input name="source" type="hidden" value="hp"><input name="biw" type="hidden"><input name="bih" type="hidden"><div class="ds" style="height:32px;margin:4px 0"><input class="lst" style="margin:0;padding:5px 8px 0 6px;vertical-align:top;color:#000" autocomplete="off" value="" title="Buscar con Google" maxlength="2048" name="q" size="57"></div><br style="line-height:0"><span class="ds"><span class="lsbb"><input class="lsb" value="Buscar con Google" name="btnG" type="submit"></span></span><span class="ds"><span class="lsbb"><input class="lsb" id="tsuid_1" value="Voy a tener suerte" name="btnI" type="submit"><script nonce="zXcc4tMJWBRoE7q_o_Z2fQ">(function(){var id='tsuid_1';document.getElementById(id).onclick = function(){if (this.form.q.value){this.checked = 1;if (this.form.iflsig)this.form.iflsig.disabled = false;}else top.location='/doodles/';};})();</script><input value="AJiK0e8AAAAAY46fQwdyVrbrgW6gkEtVkGfp2nyO0ZXL" name="iflsig" type="hidden"></span></span></td><td class="fl sblc" align="left" nowrap="" width="25%"><a href="/advanced_search?hl=es&authuser=0">B�squeda avanzada</a></td></tr></table><input id="gbv" name="gbv" type="hidden" value="1"><script nonce="zXcc4tMJWBRoE7q_o_Z2fQ">(function(){var a,b="1";if(document&&document.getElementById)if("undefined"!=typeof XMLHttpRequest)b="2";else if("undefined"!=typeof ActiveXObject){var c,d,e=["MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"];for(c=0;d=e[c++];)try{new ActiveXObject(d),b="2"}catch(h){}}a=b;if("2"==a&&-1==location.search.indexOf("&gbv=2")){var f=google.gbvu,g=document.getElementById("gbv");g&&(g.value=a);f&&window.setTimeout(function(){location.href=f},0)};}).call(this);</script></form><div id="gac_scont"></div><div style="font-size:83%;min-height:3.5em"><br><div id="gws-output-pages-elements-homepage_additional_languages__als"><style>#gws-output-pages-elements-homepage_additional_languages__als{font-size:small;margin-bottom:24px}#SIvCob{color:#3c4043;display:inline-block;line-height:28px;}#SIvCob a{padding:0 3px;}.H6sW5{display:inline-block;margin:0 2px;white-space:nowrap}.z4hgWe{display:inline-block;margin:0 2px}</style><div id="SIvCob">Ofrecido por Google en: <a href="https://www.google.com/setprefs?sig=0_vwUKUD2Xhro4NnrueK1hCfItt30%3D&hl=ca&source=homepage&sa=X&ved=0ahUKEwjjw_C44uP7AhW_UaQEHVbMChoQ2ZgBCAU">catal�</a> <a href="https://www.google.com/setprefs?sig=0_vwUKUD2Xhro4NnrueK1hCfItt30%3D&hl=gl&source=homepage&sa=X&ved=0ahUKEwjjw_C44uP7AhW_UaQEHVbMChoQ2ZgBCAY">galego</a> <a href="https://www.google.com/setprefs?sig=0_vwUKUD2Xhro4NnrueK1hCfItt30%3D&hl=eu&source=homepage&sa=X&ved=0ahUKEwjjw_C44uP7AhW_UaQEHVbMChoQ2ZgBCAc">euskara</a> </div></div></div><span id="footer"><div style="font-size:10pt"><div style="margin:19px auto;text-align:center" id="WqQANb"><a href="http://www.google.es/intl/es/services/">Soluciones Empresariales</a><a href="/intl/es/about.html">Todo acerca de Google</a><a href="https://www.google.com/setprefdomain?prefdom=ES&prev=https://www.google.es/&sig=K_a2UXepORMQOw5-SHU8h4noB_VWk%3D">Google.es</a></div></div><p style="font-size:8pt;color:#70757a">© 2022 - <a href="/intl/es/policies/privacy/">Privacidad</a> - <a href="/intl/es/policies/terms/">T�rminos</a></p></span></center><script nonce="zXcc4tMJWBRoE7q_o_Z2fQ">(function(){window.google.cdo={height:757,width:1440};(function(){var a=window.innerWidth,b=window.innerHeight;if(!a||!b){var c=window.document,d="CSS1Compat"==c.compatMode?c.documentElement:c.body;a=d.clientWidth;b=d.clientHeight}a&&b&&(a!=google.cdo.width||b!=google.cdo.height)&&google.log("","","/client_204?&atyp=i&biw="+a+"&bih="+b+"&ei="+google.kEI);}).call(this);})();</script> <script nonce="zXcc4tMJWBRoE7q_o_Z2fQ">(function(){google.xjs={ck:'xjs.hp.oxai9SxkIQY.L.X.O',cs:'ACT90oEGh-_ImDfBjn6aD_ABGaOlD2MqVw',excm:[]};})();</script> <script nonce="zXcc4tMJWBRoE7q_o_Z2fQ">(function(){var u='/xjs/_/js/k=xjs.hp.en.9b-uVUIpJU8.O/am=AADoBABQAGAB/d=1/ed=1/rs=ACT90oG-6KYVksw4jxVvNcwan406xE6qVw/m=sb_he,d';var amd=0;var d=this||self,e=function(a){return a};var g;var l=function(a,b){this.g=b===h?a:""};l.prototype.toString=function(){return this.g+""};var h={};function m(){var a=u;google.lx=function(){p(a);google.lx=function(){}};google.bx||google.lx()}function p(a){google.timers&&google.timers.load&&google.tick&&google.tick("load","xjsls");var b=document;var c="SCRIPT";"application/xhtml+xml"===b.contentType&&(c=c.toLowerCase());c=b.createElement(c);if(void 0===g){b=null;var k=d.trustedTypes;if(k&&k.createPolicy){try{b=k.createPolicy("goog#html",{createHTML:e,createScript:e,createScriptURL:e})}catch(q){d.console&&d.console.error(q.message)}g=b}else g=b}a=(b=g)?b.createScriptURL(a):a;a=new l(a,h);c.src=a instanceof l&&a.constructor===l?a.g:"type_error:TrustedResourceUrl";var f,n;(f=(a=null==(n=(f=(c.ownerDocument&&c.ownerDocument.defaultView||window).document).querySelector)?void 0:n.call(f,"script[nonce]"))?a.nonce||a.getAttribute("nonce")||"":"")&&c.setAttribute("nonce",f);document.body.appendChild(c);google.psa=!0};google.xjsu=u;setTimeout(function(){0<amd?google.caft(function(){return m()},amd):m()},0);})();function _DumpException(e){throw e;}function _F_installCss(c){}(function(){google.jl={blt:'none',chnk:0,dw:false,dwu:true,emtn:0,end:0,ico:false,ikb:0,ine:false,injs:'none',injt:0,injth:0,injv2:false,lls:'default',pdt:0,rep:0,snet:true,strt:0,ubm:false,uwp:true};})();(function(){var pmc='{"d":{},"sb_he":{"agen":true,"cgen":true,"client":"heirloom-hp","dh":true,"ds":"","fl":true,"host":"google.com","jsonp":true,"lm":true,"msgs":{"cibl":"Borrar b�squeda","dym":"Quiz�s quisiste decir:","lcky":"Voy a tener suerte","lml":"M�s informaci�n","psrc":"Esta b�squeda se ha eliminado de tu \u003Ca href=\"/history\"\u003Ehistorial web\u003C/a\u003E.","psrl":"Eliminar","sbit":"Buscar por imagen","srch":"Buscar con Google"},"ovr":{},"pq":"","rfs":[],"sbas":"0 3px 8px 0 rgba(0,0,0,0.2),0 0 0 1px rgba(0,0,0,0.08)","stok":"gh8wSanWNWQy8f-PH0wGTjDkvYQ"}}';google.pmc=JSON.parse(pmc);})();</script> </body></html>
Também podemos fazer um pipeline para salvá-lo em um arquivo
!curl https://www.google.com > google.html
% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed100 15168 0 15168 0 0 135k 0 --:--:-- --:--:-- --:--:-- 137k
Agora podemos ver se foi salvo corretamente
!cat google.html
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="es"><head><meta content="Google.es permite acceder a la informaci�n mundial en castellano, catal�n, gallego, euskara e ingl�s." name="description"><meta content="noodp" name="robots"><meta content="text/html; charset=UTF-8" http-equiv="Content-Type"><meta content="/images/branding/googleg/1x/googleg_standard_color_128dp.png" itemprop="image"><title>Google</title><script nonce="Jo7WFU6XWWwu6NrdwaRyIw">(function(){window.google={kEI:'R5GOY-LZHLegkdUP_IqzoAE',kEXPI:'0,1359409,6059,206,4804,2316,383,246,5,5367,1123753,1197777,380713,16115,28684,22430,1362,283,12036,17580,4998,13228,516,3331,10622,22741,5081,1593,1279,2742,149,1103,840,1983,4,210,4100,3514,606,2023,2299,14668,3229,2843,7,4773,826,23475,4696,1851,15756,3,346,230,6459,149,13975,4,1528,2304,7039,20309,7422,7357,13658,4437,16786,5812,2545,4094,4052,3,3541,1,11943,30211,2,8984,1,5037,6249,19490,5679,1020,2378,28745,4568,6258,23418,1252,5835,14967,4333,4239,3245,27082,239,7916,7381,15969,874,19633,6,1923,5784,3995,21779,1120,8423,4832,26080,423,107,5690,3,14433,3890,751,14879,3,683,217,1405,1779,1854,31,1966,1119,6,8909,323,5659,1741,814,1224,10,280,2346,82,1419,3,565,401,519,68,970,1125,440,398,156,367,1034,333,3392,526,396,3,1431,3,785,2,312,2312,196,907,342,244,618,314,1,293,568,171,1104,14,89,891,56,857,306,14,509,154,246,1110,219,628,249,229,49,8,8,3,55,4,399,55,39,1072,49,43,2,468,782,83,123,641,1502,166,350,707,195,5,140,358,329,692,109,1,20,108,134,547,67,5,49,93,31,77,124,79,355,160,27,829,236,764,12,35,118,98,803,1,65,436,5,5,54,2065,262,5,3,647,3,8,2,14,39,65,380,80,14,790,346,115,99,1323,4,711,242,2,723,2286,5280608,12,5934,147,81,8798948,3311,141,795,19735,1,1,346,1755,1004,41,342,1,189,14,9,4,6,3,3,4,1,2,2,3,2,2,2,1,2,5,2,2,1,2,2,2,23947077,512,18,13,2737921,1303678,1964,3094,13579,3405,5595,11,3835,1923,3208,1069,1480676,40778',kBL:'p9Xv'};google.sn='webhp';google.kHL='es';})();(function(){var f=this||self;var h,k=[];function l(a){for(var b;a&&(!a.getAttribute||!(b=a.getAttribute("eid")));)a=a.parentNode;return b||h}function m(a){for(var b=null;a&&(!a.getAttribute||!(b=a.getAttribute("leid")));)a=a.parentNode;return b}function n(a,b,c,d,g){var e="";c||-1!==b.search("&ei=")||(e="&ei="+l(d),-1===b.search("&lei=")&&(d=m(d))&&(e+="&lei="+d));d="";!c&&f._cshid&&-1===b.search("&cshid=")&&"slh"!==a&&(d="&cshid="+f._cshid);c=c||"/"+(g||"gen_204")+"?atyp=i&ct="+a+"&cad="+b+e+"&zx="+Date.now()+d;/^http:/i.test(c)&&"https:"===window.location.protocol&&(google.ml&&google.ml(Error("a"),!1,{src:c,glmm:1}),c="");return c};h=google.kEI;google.getEI=l;google.getLEI=m;google.ml=function(){return null};google.log=function(a,b,c,d,g){if(c=n(a,b,c,d,g)){a=new Image;var e=k.length;k[e]=a;a.onerror=a.onload=a.onabort=function(){delete k[e]};a.src=c}};google.logUrl=n;}).call(this);(function(){google.y={};google.sy=[];google.x=function(a,b){if(a)var c=a.id;else{do c=Math.random();while(google.y[c])}google.y[c]=[a,b];return!1};google.sx=function(a){google.sy.push(a)};google.lm=[];google.plm=function(a){google.lm.push.apply(google.lm,a)};google.lq=[];google.load=function(a,b,c){google.lq.push([[a],b,c])};google.loadAll=function(a,b){google.lq.push([a,b])};google.bx=!1;google.lx=function(){};}).call(this);google.f={};(function(){document.documentElement.addEventListener("submit",function(b){var a;if(a=b.target){var c=a.getAttribute("data-submitfalse");a="1"===c||"q"===c&&!a.elements.q.value?!0:!1}else a=!1;a&&(b.preventDefault(),b.stopPropagation())},!0);document.documentElement.addEventListener("click",function(b){var a;a:{for(a=b.target;a&&a!==document.documentElement;a=a.parentElement)if("A"===a.tagName){a="1"===a.getAttribute("data-nohref");break a}a=!1}a&&b.preventDefault()},!0);}).call(this);</script><style>#gbar,#guser{font-size:13px;padding-top:1px !important;}#gbar{height:22px}#guser{padding-bottom:7px !important;text-align:right}.gbh,.gbd{border-top:1px solid #c9d7f1;font-size:1px}.gbh{height:0;position:absolute;top:24px;width:100%}@media all{.gb1{height:22px;margin-right:.5em;vertical-align:top}#gbar{float:left}}a.gb1,a.gb4{text-decoration:underline !important}a.gb1,a.gb4{color:#00c !important}.gbi .gb4{color:#dd8e27 !important}.gbf .gb4{color:#900 !important}</style><style>body,td,a,p,.h{font-family:arial,sans-serif}body{margin:0;overflow-y:scroll}#gog{padding:3px 8px 0}td{line-height:.8em}.gac_m td{line-height:17px}form{margin-bottom:20px}.h{color:#1558d6}em{font-weight:bold;font-style:normal}.lst{height:25px;width:496px}.gsfi,.lst{font:18px arial,sans-serif}.gsfs{font:17px arial,sans-serif}.ds{display:inline-box;display:inline-block;margin:3px 0 4px;margin-left:4px}input{font-family:inherit}body{background:#fff;color:#000}a{color:#4b11a8;text-decoration:none}a:hover,a:active{text-decoration:underline}.fl a{color:#1558d6}a:visited{color:#4b11a8}.sblc{padding-top:5px}.sblc a{display:block;margin:2px 0;margin-left:13px;font-size:11px}.lsbb{background:#f8f9fa;border:solid 1px;border-color:#dadce0 #70757a #70757a #dadce0;height:30px}.lsbb{display:block}#WqQANb a{display:inline-block;margin:0 12px}.lsb{background:url(/images/nav_logo229.png) 0 -261px repeat-x;border:none;color:#000;cursor:pointer;height:30px;margin:0;outline:0;font:15px arial,sans-serif;vertical-align:top}.lsb:active{background:#dadce0}.lst:focus{outline:none}</style><script nonce="Jo7WFU6XWWwu6NrdwaRyIw">(function(){window.google.erd={jsr:1,bv:1698,de:true};var h=this||self;var k,l=null!=(k=h.mei)?k:1,n,p=null!=(n=h.sdo)?n:!0,q=0,r,t=google.erd,v=t.jsr;google.ml=function(a,b,d,m,e){e=void 0===e?2:e;b&&(r=a&&a.message);if(google.dl)return google.dl(a,e,d),null;if(0>v){window.console&&console.error(a,d);if(-2===v)throw a;b=!1}else b=!a||!a.message||"Error loading script"===a.message||q>=l&&!m?!1:!0;if(!b)return null;q++;d=d||{};b=encodeURIComponent;var c="/gen_204?atyp=i&ei="+b(google.kEI);google.kEXPI&&(c+="&jexpid="+b(google.kEXPI));c+="&srcpg="+b(google.sn)+"&jsr="+b(t.jsr)+"&bver="+b(t.bv);var f=a.lineNumber;void 0!==f&&(c+="&line="+f);var g=a.fileName;g&&(0<g.indexOf("-extension:/")&&(e=3),c+="&script="+b(g),f&&g===window.location.href&&(f=document.documentElement.outerHTML.split(" ")[f],c+="&cad="+b(f?f.substring(0,300):"No script found.")));c+="&jsel="+e;for(var u in d)c+="&",c+=b(u),c+="=",c+=b(d[u]);c=c+"&emsg="+b(a.name+": "+a.message);c=c+"&jsst="+b(a.stack||"N/A");12288<=c.length&&(c=c.substr(0,12288));a=c;m||google.log(0,"",a);return a};window.onerror=function(a,b,d,m,e){r!==a&&(a=e instanceof Error?e:Error(a),void 0===d||"lineNumber"in a||(a.lineNumber=d),void 0===b||"fileName"in a||(a.fileName=b),google.ml(a,!1,void 0,!1,"SyntaxError"===a.name||"SyntaxError"===a.message.substring(0,11)||-1!==a.message.indexOf("Script error")?3:0));r=null;p&&q>=l&&(window.onerror=null)};})();</script></head><body bgcolor="#fff"><script nonce="Jo7WFU6XWWwu6NrdwaRyIw">(function(){var src='/images/nav_logo229.png';var iesg=false;document.body.onload = function(){window.n && window.n();if (document.images){new Image().src=src;}if (!iesg){document.f&&document.f.q.focus();document.gbqf&&document.gbqf.q.focus();}}})();</script><div id="mngb"><div id=gbar><nobr><b class=gb1>B�squeda</b> <a class=gb1 href="https://www.google.es/imghp?hl=es&tab=wi">Im�genes</a> <a class=gb1 href="https://maps.google.es/maps?hl=es&tab=wl">Maps</a> <a class=gb1 href="https://play.google.com/?hl=es&tab=w8">Play</a> <a class=gb1 href="https://www.youtube.com/?tab=w1">YouTube</a> <a class=gb1 href="https://news.google.com/?tab=wn">Noticias</a> <a class=gb1 href="https://mail.google.com/mail/?tab=wm">Gmail</a> <a class=gb1 href="https://drive.google.com/?tab=wo">Drive</a> <a class=gb1 style="text-decoration:none" href="https://www.google.es/intl/es/about/products?tab=wh"><u>M�s</u> »</a></nobr></div><div id=guser width=100%><nobr><span id=gbn class=gbi></span><span id=gbf class=gbf></span><span id=gbe></span><a href="http://www.google.es/history/optout?hl=es" class=gb4>Historial web</a> | <a href="/preferences?hl=es" class=gb4>Ajustes</a> | <a target=_top id=gb_70 href="https://accounts.google.com/ServiceLogin?hl=es&passive=true&continue=https://www.google.com/&ec=GAZAAQ" class=gb4>Iniciar sesi�n</a></nobr></div><div class=gbh style=left:0></div><div class=gbh style=right:0></div></div><center><br clear="all" id="lgpd"><div id="lga"><img alt="Google" height="92" src="/images/branding/googlelogo/1x/googlelogo_white_background_color_272x92dp.png" style="padding:28px 0 14px" width="272" id="hplogo"><br><br></div><form action="/search" name="f"><table cellpadding="0" cellspacing="0"><tr valign="top"><td width="25%"> </td><td align="center" nowrap=""><input name="ie" value="ISO-8859-1" type="hidden"><input value="es" name="hl" type="hidden"><input name="source" type="hidden" value="hp"><input name="biw" type="hidden"><input name="bih" type="hidden"><div class="ds" style="height:32px;margin:4px 0"><input class="lst" style="margin:0;padding:5px 8px 0 6px;vertical-align:top;color:#000" autocomplete="off" value="" title="Buscar con Google" maxlength="2048" name="q" size="57"></div><br style="line-height:0"><span class="ds"><span class="lsbb"><input class="lsb" value="Buscar con Google" name="btnG" type="submit"></span></span><span class="ds"><span class="lsbb"><input class="lsb" id="tsuid_1" value="Voy a tener suerte" name="btnI" type="submit"><script nonce="Jo7WFU6XWWwu6NrdwaRyIw">(function(){var id='tsuid_1';document.getElementById(id).onclick = function(){if (this.form.q.value){this.checked = 1;if (this.form.iflsig)this.form.iflsig.disabled = false;}else top.location='/doodles/';};})();</script><input value="AJiK0e8AAAAAY46fV7gpXBHCT6KAebFZAqGv1l-4BtIR" name="iflsig" type="hidden"></span></span></td><td class="fl sblc" align="left" nowrap="" width="25%"><a href="/advanced_search?hl=es&authuser=0">B�squeda avanzada</a></td></tr></table><input id="gbv" name="gbv" type="hidden" value="1"><script nonce="Jo7WFU6XWWwu6NrdwaRyIw">(function(){var a,b="1";if(document&&document.getElementById)if("undefined"!=typeof XMLHttpRequest)b="2";else if("undefined"!=typeof ActiveXObject){var c,d,e=["MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"];for(c=0;d=e[c++];)try{new ActiveXObject(d),b="2"}catch(h){}}a=b;if("2"==a&&-1==location.search.indexOf("&gbv=2")){var f=google.gbvu,g=document.getElementById("gbv");g&&(g.value=a);f&&window.setTimeout(function(){location.href=f},0)};}).call(this);</script></form><div id="gac_scont"></div><div style="font-size:83%;min-height:3.5em"><br><div id="gws-output-pages-elements-homepage_additional_languages__als"><style>#gws-output-pages-elements-homepage_additional_languages__als{font-size:small;margin-bottom:24px}#SIvCob{color:#3c4043;display:inline-block;line-height:28px;}#SIvCob a{padding:0 3px;}.H6sW5{display:inline-block;margin:0 2px;white-space:nowrap}.z4hgWe{display:inline-block;margin:0 2px}</style><div id="SIvCob">Ofrecido por Google en: <a href="https://www.google.com/setprefs?sig=0_HljXEzVisqsnlJP1S5dx0Fao0Lw%3D&hl=ca&source=homepage&sa=X&ved=0ahUKEwiimaPC4uP7AhU3UKQEHXzFDBQQ2ZgBCAU">catal�</a> <a href="https://www.google.com/setprefs?sig=0_HljXEzVisqsnlJP1S5dx0Fao0Lw%3D&hl=gl&source=homepage&sa=X&ved=0ahUKEwiimaPC4uP7AhU3UKQEHXzFDBQQ2ZgBCAY">galego</a> <a href="https://www.google.com/setprefs?sig=0_HljXEzVisqsnlJP1S5dx0Fao0Lw%3D&hl=eu&source=homepage&sa=X&ved=0ahUKEwiimaPC4uP7AhU3UKQEHXzFDBQQ2ZgBCAc">euskara</a> </div></div></div><span id="footer"><div style="font-size:10pt"><div style="margin:19px auto;text-align:center" id="WqQANb"><a href="http://www.google.es/intl/es/services/">Soluciones Empresariales</a><a href="/intl/es/about.html">Todo acerca de Google</a><a href="https://www.google.com/setprefdomain?prefdom=ES&prev=https://www.google.es/&sig=K_8O8QHBmoai9DOT5YZxMWevJK8VI%3D">Google.es</a></div></div><p style="font-size:8pt;color:#70757a">© 2022 - <a href="/intl/es/policies/privacy/">Privacidad</a> - <a href="/intl/es/policies/terms/">T�rminos</a></p></span></center><script nonce="Jo7WFU6XWWwu6NrdwaRyIw">(function(){window.google.cdo={height:757,width:1440};(function(){var a=window.innerWidth,b=window.innerHeight;if(!a||!b){var c=window.document,d="CSS1Compat"==c.compatMode?c.documentElement:c.body;a=d.clientWidth;b=d.clientHeight}a&&b&&(a!=google.cdo.width||b!=google.cdo.height)&&google.log("","","/client_204?&atyp=i&biw="+a+"&bih="+b+"&ei="+google.kEI);}).call(this);})();</script> <script nonce="Jo7WFU6XWWwu6NrdwaRyIw">(function(){google.xjs={ck:'xjs.hp.oxai9SxkIQY.L.X.O',cs:'ACT90oEGh-_ImDfBjn6aD_ABGaOlD2MqVw',excm:[]};})();</script> <script nonce="Jo7WFU6XWWwu6NrdwaRyIw">(function(){var u='/xjs/_/js/k=xjs.hp.en.9b-uVUIpJU8.O/am=AADoBABQAGAB/d=1/ed=1/rs=ACT90oG-6KYVksw4jxVvNcwan406xE6qVw/m=sb_he,d';var amd=0;var d=this||self,e=function(a){return a};var g;var l=function(a,b){this.g=b===h?a:""};l.prototype.toString=function(){return this.g+""};var h={};function m(){var a=u;google.lx=function(){p(a);google.lx=function(){}};google.bx||google.lx()}function p(a){google.timers&&google.timers.load&&google.tick&&google.tick("load","xjsls");var b=document;var c="SCRIPT";"application/xhtml+xml"===b.contentType&&(c=c.toLowerCase());c=b.createElement(c);if(void 0===g){b=null;var k=d.trustedTypes;if(k&&k.createPolicy){try{b=k.createPolicy("goog#html",{createHTML:e,createScript:e,createScriptURL:e})}catch(q){d.console&&d.console.error(q.message)}g=b}else g=b}a=(b=g)?b.createScriptURL(a):a;a=new l(a,h);c.src=a instanceof l&&a.constructor===l?a.g:"type_error:TrustedResourceUrl";var f,n;(f=(a=null==(n=(f=(c.ownerDocument&&c.ownerDocument.defaultView||window).document).querySelector)?void 0:n.call(f,"script[nonce]"))?a.nonce||a.getAttribute("nonce")||"":"")&&c.setAttribute("nonce",f);document.body.appendChild(c);google.psa=!0};google.xjsu=u;setTimeout(function(){0<amd?google.caft(function(){return m()},amd):m()},0);})();function _DumpException(e){throw e;}function _F_installCss(c){}(function(){google.jl={blt:'none',chnk:0,dw:false,dwu:true,emtn:0,end:0,ico:false,ikb:0,ine:false,injs:'none',injt:0,injth:0,injv2:false,lls:'default',pdt:0,rep:0,snet:true,strt:0,ubm:false,uwp:true};})();(function(){var pmc='{"d":{},"sb_he":{"agen":true,"cgen":true,"client":"heirloom-hp","dh":true,"ds":"","fl":true,"host":"google.com","jsonp":true,"lm":true,"msgs":{"cibl":"Borrar b�squeda","dym":"Quiz�s quisiste decir:","lcky":"Voy a tener suerte","lml":"M�s informaci�n","psrc":"Esta b�squeda se ha eliminado de tu \u003Ca href=\"/history\"\u003Ehistorial web\u003C/a\u003E.","psrl":"Eliminar","sbit":"Buscar por imagen","srch":"Buscar con Google"},"ovr":{},"pq":"","rfs":[],"sbas":"0 3px 8px 0 rgba(0,0,0,0.2),0 0 0 1px rgba(0,0,0,0.08)","stok":"GYSMF2y7hymT0L3W0W4RPVIsSrU"}}';google.pmc=JSON.parse(pmc);})();</script> </body></html>
Baixar arquivos com wget
Outro comando parecido é wget
, no entanto, ao contrário de curl
, wget
baixa o arquivo diretamente
!wget https://www.google.com
--2022-12-06 01:49:19-- https://www.google.com/Resolviendo www.google.com (www.google.com)... 142.250.200.68, 2a00:1450:4003:80c::2004Conectando con www.google.com (www.google.com)[142.250.200.68]:443... conectado.Petición HTTP enviada, esperando respuesta... 200 OKLongitud: no especificado [text/html]Guardando como: “index.html.1”index.html.1 [ <=> ] 14,76K --.-KB/s en 0,002s2022-12-06 01:49:19 (7,17 MB/s) - “index.html.1” guardado [15117]
!ls -l
total 316-rw-rw-r-- 1 wallabot wallabot 285898 dic 6 00:28 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 Abc-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos1-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos123-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot2.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 file.txt-rw-rw-r-- 1 wallabot wallabot 15168 dic 6 01:48 google.html-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 index.html-rw-rw-r-- 1 wallabot wallabot 15117 dic 6 01:49 index.html.1-rw-rw-r-- 1 wallabot wallabot 182 dic 6 01:06 lista.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 01:08 secuential.txt
Vemos que o guardou como index.html
, que é como o Google o nomeou.
Se queremos que seja salvo com um nome específico, podemos usar a flag -O
.
!wget https://www.google.com -O google2.html
--2022-12-06 01:49:37-- https://www.google.com/Resolviendo www.google.com (www.google.com)... 142.250.200.68, 2a00:1450:4003:80c::2004Conectando con www.google.com (www.google.com)[142.250.200.68]:443... conectado.Petición HTTP enviada, esperando respuesta... 200 OKLongitud: no especificado [text/html]Guardando como: “google2.html”google2.html [ <=> ] 14,78K --.-KB/s en 0,003s2022-12-06 01:49:37 (5,27 MB/s) - “google2.html” guardado [15131]
!ls -l
total 332-rw-rw-r-- 1 wallabot wallabot 285898 dic 6 00:28 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 Abc-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos1-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos123-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot2.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 file.txt-rw-rw-r-- 1 wallabot wallabot 15131 dic 6 01:49 google2.html-rw-rw-r-- 1 wallabot wallabot 15168 dic 6 01:48 google.html-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 index.html-rw-rw-r-- 1 wallabot wallabot 15117 dic 6 01:49 index.html.1-rw-rw-r-- 1 wallabot wallabot 182 dic 6 01:06 lista.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 01:08 secuential.txt
Depuração da rota com traceroute
Um comando muito útil é ver a rota até um destino, para isso usamos traceroute
, por exemplo, vamos ver todos os sites pelos quais tenho que passar para me conectar ao Google
!traceroute www.google.com
traceroute to www.google.com (142.250.200.68), 64 hops max1 192.168.1.1 0,435ms 0,154ms 0,133ms2 188.127.176.1 3,979ms 2,914ms 3,397ms3 10.15.0.77 3,600ms 3,914ms 2,669ms4 10.15.246.6 3,567ms 3,713ms 2,926ms5 * * *6 72.14.209.84 3,981ms 2,914ms 2,993ms7 * * *8 142.251.54.148 3,856ms 2,916ms 2,905ms9 142.250.200.68 2,908ms 2,949ms 3,037ms
Depuração da rota com mtr
Outra ferramenta de depuração é o mtr
, que é uma versão aprimorada do traceroute
. Oferece informações de cada salto, como o tempo de resposta, a porcentagem de pacotes perdidos, etc.
!mtr -n maximofn.com
wallabot (192.168.178.144)Keys: Help Display mode Restart statistics Order of fields quitPackets PingsHost Loss% Snt Last Avg Best Wrst StDev1. 192.168.178.1 0.0% 345 0.3 0.3 0.3 0.3 0.02. 192.168.0.1 0.0% 344 0.8 1.1 1.1 1.1 0.03. (waiting for reply)4. 10.183.52.41 0.0% 344 2.8 2.5 2.5 2.5 0.05. 172.29.0.161 47.7% 344 2.3 3.1 3.1 23.1 0.06. (waiting for reply)7. 193.149.1.97 0.0% 344 3.6 3.6 3.6 38.6 0.08. (waiting for reply)9. 185.125.78.197 2.9% 344 6.9 6.9 6.9 6.9 0.0
Como pode ver no salto 5, perde-se quase 50% dos pacotes, por isso serviria para eu ligar para a minha companhia de telefone e pedir que tentem me encaminhar por outro lado.
Nome da nossa máquina com hostname
Se quisermos saber o nome do nosso computador podemos usar hostname
, o que é útil se quisermos nos conectar à nossa máquina a partir de outra.
!hostname
wallabot
Informações de link de gateway padrão com route -n
Se queremos conhecer nosso gateway padrão, usamos o comando route -n
!route -n
Tabla de rutas IP del núcleoDestino Pasarela Genmask Indic Métric Ref Uso Interfaz0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 enp6s0169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 enp6s0172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-470e52ae2708192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 enp6s0
Informações de IP de um domínio com nslookup
Se queremos saber o IP de algum domínio, podemos saber mediante o comando nslookup
!nslookup google.com
Server: 127.0.0.53Address: 127.0.0.53#53Non-authoritative answer:Name: google.comAddress: 142.250.185.14Name: google.comAddress: 2a00:1450:4003:808::200e
Isso nos diz que o IPv4 do Google é 172.217.168.174 e o seu IPv6 é 2a00:1450:4003:803::200e
Informações da nossa rede com netstats
O último comando de utilidade é netstats
, este comando nos dá o estado da nossa rede, além disso, com a flag -i
, nos retorna nossas interfaces de rede.
!netstat -i
Tabla de la interfaz del núcleoIface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flgbr-470e5 1500 0 0 0 0 0 0 0 0 BMUdocker0 1500 0 0 0 0 0 0 0 0 BMUenp6s0 1500 148385 0 2182 0 106135 0 0 0 BMRUlo 65536 11674 0 0 0 11674 0 0 0 LRUwlp5s0 1500 0 0 0 0 0 0 0 0 BMU
Consultas DNS com dig
Com o comando dig <domínio>
podemos fazer consultas DNS, por exemplo, vamos fazer uma consulta ao Google
!dig google.com
; <<>> DiG 9.16.1-Ubuntu <<>> google.com;; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20527;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1;; OPT PSEUDOSECTION:; EDNS: version: 0, flags:; udp: 65494;; QUESTION SECTION:;google.com. IN A;; ANSWER SECTION:google.com. 283 IN A 142.250.184.14;; Query time: 8 msec;; SERVER: 127.0.0.53#53(127.0.0.53);; WHEN: dom sep 24 01:32:07 CEST 2023;; MSG SIZE rcvd: 55
Pode-se ver
```;; SEÇÃO DE RESPOSTA:google.com. 283 IN A 142.250.184.14
Portanto, a consulta nos forneceu o IP do Google.
Podemos fazer a consulta a um servidor DNS em particular com dig @<servidor DNS> <domínio>
!dig @1.1.1.1 google.com
; <<>> DiG 9.16.1-Ubuntu <<>> @1.1.1.1 google.com; (1 server found);; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15633;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0;; QUESTION SECTION:;google.com. IN A;; ANSWER SECTION:google.com. 190 IN A 142.250.184.14;; Query time: 8 msec;; SERVER: 1.1.1.1#53(1.1.1.1);; WHEN: dom sep 24 01:33:40 CEST 2023;; MSG SIZE rcvd: 44
Fizemos a mesma consulta, mas a fizemos ao DNS da Cloudflare
Compactando arquivos
Antes de comprimir e descomprimir vamos ver o que vamos comprimir, primeiro imprimimos nosso caminho e listamos os arquivos.
!pwd; ls -l
/home/wallabot/Documentos/web/portafolio/posts/pruebatotal 332-rw-rw-r-- 1 wallabot wallabot 285898 dic 6 00:28 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 Abc-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos1-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos123-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot2.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 file.txt-rw-rw-r-- 1 wallabot wallabot 15131 dic 6 01:49 google2.html-rw-rw-r-- 1 wallabot wallabot 15168 dic 6 01:48 google.html-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 index.html-rw-rw-r-- 1 wallabot wallabot 15117 dic 6 01:49 index.html.1-rw-rw-r-- 1 wallabot wallabot 182 dic 6 01:06 lista.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 01:08 secuential.txt
Vamos criar uma nova pasta e copiar tudo o que está dentro da pasta atual para ela
!mkdir tocompress; cp * tocompress; ls -l
cp: -r not specified; omitting directory 'tocompress'total 336-rw-rw-r-- 1 wallabot wallabot 285898 dic 6 00:28 2021-02-11-Introduccion-a-Python.ipynb-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 Abc-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos1-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 datos123-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot2.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 dot.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 file.txt-rw-rw-r-- 1 wallabot wallabot 15131 dic 6 01:49 google2.html-rw-rw-r-- 1 wallabot wallabot 15168 dic 6 01:48 google.html-rw-rw-r-- 1 wallabot wallabot 0 dic 6 00:56 index.html-rw-rw-r-- 1 wallabot wallabot 15117 dic 6 01:49 index.html.1-rw-rw-r-- 1 wallabot wallabot 182 dic 6 01:06 lista.txt-rw-rw-r-- 1 wallabot wallabot 0 dic 6 01:08 secuential.txtdrwxrwxr-x 2 wallabot wallabot 4096 dic 6 01:52 tocompress
Como vemos, foi copiado tudo, exceto a própria pasta tocompress
, já que não colocamos o flag -r
no comando cp
. Mas o que aconteceu é o que queríamos.
Compactar com tar
O primeiro comando que vamos usar para comprimir é tar
ao qual vamos adicionar o flag -c
de compress, -v
de verbose, para que nos mostre o que está fazendo, e o flag -f
de file, seguido pelo nome que queremos que o arquivo comprimido tenha e o nome do arquivo que queremos comprimir.
!tar -cvf tocompress.tar tocompress
tocompress/tocompress/lista.txttocompress/dot.txttocompress/google.htmltocompress/index.htmltocompress/Abctocompress/google2.htmltocompress/dot2.txttocompress/secuential.txttocompress/index.html.1tocompress/file.txttocompress/datos1tocompress/2021-02-11-Introduccion-a-Python.ipynbtocompress/datos123
!ls -l