============== Shell: Parte 1 ============== Spostarsi nel Filesystem ------------------------ ========= =================================== ============================== comando funzione opzioni principali ========= =================================== ============================== ``pwd`` stampa la directory corrente ``-l``, ``-h``, ``-t``, ``-S`` ``ls`` elenca i file in una directory ``-l`` ``cd`` cambia la directory corrente ``-`` ``mv`` sposta o rinomina un file/directory ``-i``, ``-f`` ``cp`` copia un file/directory ``-i``, ``-f``, ``-r`` ``rm`` rimuove un file/directory ``-i``, ``-f``, ``-r`` ``mkdir`` crea una o piu' directory ``-p`` ========= =================================== ============================== I comandi qui sopra spostano o copiano file, ma non modificano i contenuti degli stessi. **Esempio**. Se non sapete dove vi trovate, potete usare ``cd`` senza argomenti per tornare alla vostra home. Wildcards, Parte 1 ------------------ La shell esegue quella che si chiama *wildcard expansion*: ogni volta che incontra l'asterisco ``*`` lo sostituisce con la lista dei file/directory che "fanno *match*". **Esempio**. Se eseguo:: ls * la shell sostituisce ``*`` con la lista di tutti i file e le directory nella directory attuale (perche' tutti fanno *match* con ``*``). Invece:: ls ~/informatica/* sostituisce ``*`` con la lista dei file in ``~/informatica``. Supponendo che in ``~/informatica`` ci siano solo tre file, chiamati ``test1``, ``test2`` e ``results``, il comando precedente sarebbe equivalente a:: ls ~/informatica/test1 ~/informatica/test2 ~/informatica/results Se avessi eseguito:: ls ~/informatica/test* la wildcard ``test*`` avrebbe fatto *match* solo con ``test1`` e ``test2``, ed il comando sarebbe stato equivalente a:: ls ~/informatica/test1 ~/informatica/test2 Qui ``results`` non fa *match*, quindi non viene incluso. Esercizi -------- #. Cosa fa ``ls data/prot-fasta data/prot-pdb``? Confrontalo con ``ls data/prot-fasta`` e ``ls data/prod-pdb`` per conferma. #. Cosa fa ``ls`` se gli si passa un path ad un file piuttosto che ad una directory? E ``ls -l``? #. Cosa fa ``ls`` se gli si passa path misti a file e directory? #. Che differenza c'e' tra: #. ``cd .`` e ``cd ..``? #. ``cd ..`` e ``cd..``? #. ``ls`` e ``ls .``? #. ``ls`` e ``ls *``? Perche'? #. ``ls -l -h`` e ``ls -lh``? #. ``ls -l`` e ``ls - l``? #. Il risultato di ``ls ../*`` "include" il risultato di ``ls .``? #. Che differenza c'e' tra ``ls /home/login.utente/bio`` e ``ls ../login.utente/bio`` se ``pwd`` e' ``~``? #. Il file ``data/empty1`` e' vuoto? E il file ``data/empty2``? #. Cosa fa il comando (alcuni dei comandi seguenti possono non funzionare; scopo dell'esercizio e' scoprire perche'; partite sempre da una directory vuota): #. ``mkdir muu/bee``? #. ``mkdir -p muu/bee/grr; rm muu/bee/grr``? #. ``mkdir -p muu/bee/grr; rm -r muu/bee``? #. ``mkdir muu; cd .; mkdir muu``? #. ``mkdir muu; cd .; mkdir -p muu``? #. Il comando ``rm -r muu/bee`` rimuove anche la directory ``muu``? #. Stampare la lista dei file contenute nelle directory ``data/deep0``, ``data/deep1``, ..., ``data/deep4``. #. Stampare la lista di *tutti* i file, inclusi quelli nelle sotto-directory. Soluzioni --------- #. Stampa a schermo prima ls lista dei contenuti della directory ``data/prot-fasta``, poi quelli della directory ``data/prot-pdb``. Quindi e' identico a lanciare:: ls data/prot-fasta ls data/prot-pdb separatamente. #. Stampa il nome del file. Con ``-l``, stampa anche informazioni aggiuntive (proprietario, permessi, *etc.*) #. Stampa i nomi di tutti i file, ed i contenuti di tutte le directory. #. Soluzioni: #. Il primo non fa niente, il secondo ci sposta nella directory che contiene la directory in cui ci troviamo. #. Il primo funziona, il secondo no -- manca uno spazio. #. Nessuna. #. Il primo stampa la lista dei contenuti della directory corrente. Il secondo invece subisce una wildcard expansion: ``*`` viene sostituito con la lista di tutti i file nella directory corrente. Quindi ``ls *`` stampa la lista dei file nella directory corrente, piu' i contenuti di tutte le directory. #. Nessuna. #. Il primo funziona, il secondo no -- ``- l`` ha uno spazio di troppo, non e' un'opzione. #. Si'. Nella wildcard expansion ``../*`` c'e' anche la directory corrente, ``.``. #. Nessuna. #. ``ls -l data/empty1`` mostra chiaramente che il file non e' vuoto, mentre ``ls -l data/empty2`` mostra che lo e'. #. Soluzioni: #. Da' errore. Creare directory innestate richiede l'opzione ``-p``. #. Da' errore. Rimuovere una directory (in questo caso ``muu/bee/grr``) richiede l'opzione ``-r``. #. Funziona. Crea le directory innestate ``muu/bee/grr``, poi cancella ``muu/bee`` e la directory contenuta in essa, ``muu/bee/grr``. #. Da' errore. La directory ``muu`` esiste gia' prima della seconda invocazione a ``mkdir``. #. Funziona. Crea la directory ``muu``, poi prova a crearla di nuovo. ``mkdir`` non da' errore perche' con ``-p`` gli chiediamo di ignorare il fatto che ``muu`` esiste gia'. #. No. #. ``ls data/deep0; ls data/deep1; ... ;ls data/deep4``, oppure ``ls data/deep*``. #. ``ls -r data/deep*``.