rm (Unix) - rm (Unix)

rm
Comando Rm --help - Unix.png
Il rmcomando
Autori originali Ken Thompson , Dennis Ritchie
( AT&T Bell Laboratories )
Sviluppatore/i Varie open-source e commerciali sviluppatori
Versione iniziale 3 novembre 1971 ; 49 anni fa ( 1971-11-03 )
Sistema operativo Unix , Unix-like , V , Plan 9 , Inferno , KolibriOS , IBM i
piattaforma Multipiattaforma
genere Comando
Licenza coreutils : GPLv3+

In informatica , rm(abbreviazione di remove ) è un comando di base su Unix e sistemi operativi simili a Unix utilizzato per rimuovere oggetti come file di computer , directory e collegamenti simbolici dai file system e anche file speciali come nodi di dispositivo , pipe e socket , simili al delcomando in MS-DOS , OS/2 e Microsoft Windows . Il comando è disponibile anche nella shell EFI .

Panoramica

Il rmcomando rimuove i riferimenti agli oggetti dal filesystem usando la chiamata di sistema unlink , dove quegli oggetti potrebbero avere più riferimenti (ad esempio, un file con due nomi diversi), e gli oggetti stessi vengono scartati solo quando tutti i riferimenti sono stati rimossi e non i programmi hanno ancora handle aperti per gli oggetti.

Ciò consente scenari in cui un programma può aprire un file, rimuoverlo immediatamente dal filesystem e quindi utilizzarlo per lo spazio temporaneo, sapendo che lo spazio del file verrà recuperato dopo la chiusura del programma, anche se si chiude in modo anomalo.

Il comando generalmente non distrugge i dati del file, poiché il suo scopo è semplicemente quello di scollegare i riferimenti e lo spazio del filesystem liberato potrebbe ancora contenere dati rimanenti dal file rimosso. Questo può essere un problema di sicurezza in alcuni casi e le versioni rinforzate a volte prevedono la cancellazione dei dati mentre l'ultimo collegamento viene tagliato e sono disponibili programmi come shred e srm che forniscono specificamente la capacità di cancellare i dati.

rmè generalmente visto solo su sistemi operativi derivati ​​da UNIX , che in genere non prevedono il recupero dei file cancellati attraverso un meccanismo come il cestino , da qui la tendenza degli utenti a racchiudere rmin una sorta di wrapper per limitare la cancellazione accidentale dei file.

Esistono utilità di ripristino che tenteranno di ricostruire l'indice e possono riportare il file se le parti non sono state riutilizzate.

Storia

Su alcune vecchie versioni di Unix, il rmcomando eliminava le directory se erano vuote. Questo comportamento può ancora essere ottenuto in alcune versioni di rmcon il -dflag, ad esempio i BSD (come FreeBSD , NetBSD , OpenBSD e macOS ) derivati ​​da 4.4BSD-Lite2.

La versione in rmbundle in GNU coreutils è stata scritta da Paul Rubin, David MacKenzie, Richard Stallman e Jim Meyering. Questa versione fornisce anche -dun'opzione, per aiutare con la compatibilità. La stessa funzionalità è fornita dal rmdircomando standard .

L' -iopzione nella versione 7 ha sostituito dsw, o "elimina dagli switch", che ha debuttato nella versione 1 . Doug McIlroy ha scritto che dsw"era uno strumento di disperazione progettato per ripulire i file con nomi indicibili".

KolibriOS include un'implementazione del rmcomando.

Anche il comando rm è stato portato sul sistema operativo IBM i .

Sintassi

rmelimina il file specificato dopo l'aggiunta delle opzioni. Gli utenti possono utilizzare un percorso completo o un percorso file relativo per specificare i file da eliminare. rmnon elimina una directory per impostazione predefinita. rm fooelimina il file " foo " nella directory in cui si trova attualmente l'utente.

rm, come altri comandi, usa le opzioni per specificare come si comporterà:

  • -r, "ricorsivo", che rimuove le directory, rimuovendo i contenuti in modo ricorsivo in anticipo (in modo da non lasciare i file senza una directory in cui risiedere).
  • -i, "interattivo" che chiede di confermare ogni cancellazione.
  • -f, "force", che ignora i file inesistenti e sovrascrive qualsiasi richiesta di conferma (annullando effettivamente -i), sebbene non rimuoverà i file da una directory se la directory è protetta da scrittura.
  • -v, "verbose", che stampa ciò che rmsta facendo sul terminale
  • -d, "directory", che elimina una directory vuota e funziona solo se la directory specificata è vuota.
  • --one-file-system, rimuove solo i file sullo stesso file system dell'argomento e ignorerà i file system montati.

rmpuò essere sovrastato da una shell alias ( C shell alias , Bourne shell o Bash) funzione di " rm -i" in modo da evitare la cancellazione accidentale di file. Se un utente desidera ancora eliminare un numero elevato di file senza conferma, può annullare manualmente l' -iargomento aggiungendo l' -fopzione (poiché l'opzione specificata in seguito nella riga di comando espansa " rm -i -f" ha la precedenza). Sfortunatamente questo approccio genera abitudini pericolose verso l'uso dei caratteri jolly, portando alla propria versione di rimozioni accidentali.

rm -rf(variamente, rm -rf /, rm -rf *, e altri) è spesso usato in barzellette e aneddoti sui disastri di Unix. La rm -rf /variante del comando, se eseguita da un superutente , causerebbe l'eliminazione dalla macchina di tutti i file accessibili dall'attuale file system.

rmè spesso usato insieme a xargs per fornire un elenco di file da eliminare:

 xargs rm < filelist

Oppure, per rimuovere tutte le immagini PNG in tutte le directory sotto quella corrente:

 find . -name '*.png' -exec rm {} +

permessi

Di solito, sulla maggior parte dei filesystem, l'eliminazione di un file richiede il permesso di scrittura sulla directory padre (ed il permesso di esecuzione, per poter entrare nella directory in primo luogo). (Si noti che, confondendo i principianti, i permessi sul file stesso sono irrilevanti. Tuttavia, GNU rmchiede conferma se un file protetto da scrittura deve essere cancellato, a meno che non venga utilizzata l'opzione -f.)

Per eliminare una directory (con rm -r), è necessario eliminare tutti i suoi contenuti in modo ricorsivo. Ciò richiede che uno debba avere il permesso di lettura, scrittura ed esecuzione per quella directory (se non è vuota) e tutte le sottodirectory non vuote in modo ricorsivo (se ce ne sono). I permessi di lettura sono necessari per elencare i contenuti della directory al fine di eliminarli. Questo a volte porta a una strana situazione in cui una directory non vuota non può essere eliminata perché non si dispone dei permessi di scrittura su di essa e quindi non è possibile eliminarne il contenuto; ma se la stessa directory fosse vuota, sarebbe possibile eliminarla.

Se un file risiede in una directory con lo sticky bit impostato, l'eliminazione del file richiede che uno sia il proprietario del file.

Protezione della radice del filesystem

Sun Microsystems ha introdotto la rm -rf /protezione " " in Solaris 10, rilasciato per la prima volta nel 2005. Dopo aver eseguito il comando, il sistema ora segnala che la rimozione di / non è consentita. Poco dopo, la stessa funzionalità è stata introdotta nella versione di utilità di FreeBSDrm . GNU si rm rifiuta di eseguire rm -rf /se --preserve-rootviene data l' opzione, che è stata l'impostazione predefinita dal rilascio della versione 6.4 di GNU Core Utilities nel 2006. Nei sistemi più recenti, questo failsafe è sempre attivo, anche senza l'opzione. Per eseguire il comando, l'utente deve ignorare il failsafe aggiungendo l'opzione --no-preserve-root, anche se è il superutente.

A prova di utente

Gli amministratori di sistema, i progettisti e persino gli utenti spesso tentano di difendersi dall'eliminazione accidentale di file creando un alias o una funzione sulla falsariga di:

alias rm="rm -i"
rm () { /bin/rm -i "$@" ; }

Ciò si traduce nel rmchiedere all'utente di confermare file per file se deve essere eliminato, premendo il tasto Y o N. Sfortunatamente, questo tende ad addestrare gli utenti a non prestare attenzione ai caratteri jolly che immettono nei loro rmcomandi, oltre a incoraggiare la tendenza a battere alternativamente ye la chiave di ritorno per affermare le rimozioni, fino a quando non hanno superato l'unico file che avevano bisogno di conservare. Gli utenti sono stati persino visti arrivare fino a " ", che inserisce automaticamente "y" per ogni file. yes | rm files

Un compromesso che consente agli utenti di confermare solo una volta, incoraggia l'uso di caratteri jolly appropriati e rende più semplice la verifica dell'elenco può essere ottenuto con qualcosa come:

if [ -n "$PS1" ] ; then
  rm () 
  { 
      ls -FCsd "$@"
      echo 'remove[ny]? ' | tr -d '\012' ; read
      if [ "_$REPLY" = "_y" ]; then
          /bin/rm -rf "$@"
      else
          echo '(cancelled)'
      fi
  }
fi

È importante notare che questa funzione non dovrebbe essere trasformata in uno script di shell, il che correrebbe il rischio che venga trovata prima del sistema rmnel percorso di ricerca, né dovrebbe essere consentita in shell non interattive in cui potrebbe interrompere i lavori batch . Racchiudere la definizione nel if [ -n "$PS1" ] ; then ....  ; ficostrutto protegge da quest'ultimo.

Esistono alternative di terze parti che impediscono la cancellazione accidentale di file importanti, come "safe-rm" o "trash".

Limitazione massima degli argomenti della riga di comando

L' implementazione di GNU Core Utilities utilizzata in più distribuzioni Linux sarà limitata negli argomenti della riga di comando byte numero di pagine allocate all'interno del kernel per gli argomenti della riga di comando prima del kernel 2.6.23 Rilasciato il 9 ottobre 2007 è stato definito al momento della compilazione del kernel alla variabile MAX_ARG_PAGESin include/linux/binfmts.hfile ma i nuovi kernel limitano la lunghezza massima dell'argomento al 25% del limite massimo dello stack (ulimit -s). Errore: /bin/rm: Argument list too long.verrà richiesto se il limite di argomenti della riga di comando è superato

Guarda anche

Riferimenti

Ulteriori letture

link esterno