Sovrascrivi una directory esistente?


11

Ho un nome di directory foosituato in ~/Desktop. Supponiamo di voler creare una directory da un terminale con lo stesso nome e nella stessa posizione. Quando ho provato mkdirha dato un errore:

mkdir: cannot create directory `/home/nux/Desktop/foo': File exists

Questo ha senso, ma voglio sostituirlo foose esiste. Ho guardato attraverso man mkdirma non c'è alcuna opzione che lo faccia.

Quindi, come sovrascrivere la foodirectory?

Perché non mkdirhai un'opzione per farlo?


Sostituisci foocome in cancella tutto il suo contenuto? mkdirha -pun'opzione che ignora se la directory esiste.
muru,

4
Quindi, vuoi un comando che eliminerà tutti i file in una directory quando crei accidentalmente una nuova directory con lo stesso nome? E ti chiedi perché non c'è alcuna opzione? È uno scherzo?
Marty Fried,

i downvoter chiariscono semplicemente perché, sto chiedendo un comando che cancella una directory esistente
nux,

1
@nux per me la domanda non ha senso ... spiega perché mai vuoi eliminare e ricreare una directory. Abbiamo comandi per tutto ciò che devi fare nella directory. mkdir non ha bisogno di un'opzione per rimuovere / ricreare.
Rinzwind,

1
è un crimine qui se sto facendo una domanda logica !!
nux,

Risposte:


21

Se il tuo obiettivo è eseguire un comando su una riga che:

  • Rimuove e ricrea la directory ~/Desktop/foose esiste già.
  • Crea semplicemente la directory ~/Desktop/foose non esiste già.

Quindi puoi usare:

rm -r ~/Desktop/foo; mkdir ~/Desktop/foo

; equivale a una nuova riga, ma consente di eseguire più comandi su una singola riga (ovvero, come "comando singolo").

  • Se la directory che stai rimuovendo potrebbe contenere file di sola lettura, avrai bisogno del -fflag per rimuoverli senza richiedere all'utente in modo interattivo. Va bene, ma ti consiglio di stare particolarmente attento rm -rf .... Vedi man rmper i dettagli.
  • È necessario il rmcomando per terminare prima che mkdirl'esecuzione del comando; questo è il motivo da usare al ;posto di &. (Un comando precedente &viene eseguito in modo asincrono in background.)
  • È necessario mkdireseguire il rmcomando quando il comando ha esito positivo; questo è il motivo da usare al ;posto di ||.
  • È necessario mkdireseguire il rmcomando quando il comando ha esito negativo (in genere un errore indica che la directory non esisteva già); questo è il motivo da usare al ;posto di &&.
  • Il rmcomando potrebbe non riuscire anche quando la directory esisteva già, nel qual caso il mkdircomando fallirà anche, ma i messaggi di errore avranno senso e probabilmente non sarà necessario aggiungere un passaggio intermedio per verificare fool'esistenza prima di provare a crearlo.

Vedere 3.2.3 Elenchi dei comandi nella Bash Reference Manual per ulteriori informazioni e spiegazioni sui ;, &, ||, e &&gli operatori.

Come suggerito da Muru (e elaborato da Rinzwind ), ti consigliorsync di verificare se soddisferà le tue esigenze di backup. Ci sono alcune utili guide aggiuntive nella pagina della documentazione di rsync , così come questa guida di Ubuntu rsync .

perché mkdir non ha questa opzione?

mkdircrea directory ("mk" sta per "make" ). Perché anche eliminare in modo ricorsivo le directory e tutti i file in esse contenuti sarebbero dannosi, perché violerebbe il principio del minimo stupore in un modo che probabilmente porterebbe alla perdita di dati.

rmdirnon rimuove nemmeno le directory che contengono file (non di directory). rmha -run'opzione, che ha senso poiché rmsi prevede di rimuovere i file (questo è il suo scopo, quindi il pericolo intrinseco è intuitivo e gli utenti in genere sanno di stare attenti quando eseguono i rmcomandi).


+1 eccellente. Questa risposta va ben oltre nello spiegare la sintassi, qualcosa che vorrei fosse più profondo nei siti di stackexchange. Ci sono molte pepite d'oro in questa risposta.
Govind Rai,

7

No, non esiste un singolo comando per fare ciò che stai chiedendo.

Perché?

Questa è la filosofia Unix: scrivere programmi che fanno una cosa e la fanno bene. Scrivi programmi per lavorare insieme. 1

In questo caso, i comandi mkdire rmfanno ciò di cui hai bisogno e funzionano bene insieme, poiché rm -relimineranno anche la directory, quindi un successivo mkdircreerà la directory.

1 The Art of Unix Programming , Eric S. Raymond, stesso citando Doug McIlroy.


per ora, questa è una buona risposta, lo
cercherò

3

Il comando per rimuovere una directory è rm. Quindi hai bisogno di 2 comandi.

rm -r ~/Desktop/foo/
mkdir ~/Desktop/foo/

Come mostrato nei commenti, puoi concatenarli con ;(= fai entrambi anche se 1st fallisce) o &&(= solo mkdir quando rm non fallisce).

Il -rè per la rimozione di dirs. Il primo comando rimuove anche TUTTI i contenuti della directory. Se questa NON è la tua intenzione, sia rm che mkdir non sono quello che stai cercando: i permessi sono chmode chown.

perché mkdir non ha questa opzione?

Ambiguità. mkdirsignifica fare directory. Non rimuovere e creare directory. E poiché il rmcomando serve per eliminare elementi non è necessario rmdirpoter rimuovere una directory.


lo so, ma intendo un comando, puoi visualizzare la mia modifica la cambio
nux,

In primo luogo spiegare perché è necessario ricreare la directory. Non ha senso per me.
Rinzwind,

il mio bisogno ha senso, mi chiedo solo come? per me ha senso :)
nux,

@nux no non lo fa. E nemmeno il manutentore di mkdir capisce perché;) Ciò che vuoi è inutile e non ha alcun merito.
Rinzwind,

ok se vuoi sapere che sto facendo uno script per fare il backup in una nuova directory con lo stesso nome di pippo e permette di sostituirlo se esiste per ridurre lo spazio
nux,

1

Per farlo nel modo più pulito io uso questo:

create_clean_directory(){
    dir_name=$1
    if [ -d "$dir_name" ]; then
        echo "Removing $dir_name"
        rm -rf "$dir_name"
    elif [ -f "$dir_name" ]; then
        echo "File with this name already exists, not a directory."
        exit
    fi
    if mkdir "$dir_name"; then
        echo "Clean directory created: $dir_name"
        return 0
    else
        echo "Creating directory failed: $dir_name"
        return 1
    fi 
}

E per usarlo:

create_clean_directory <dir_name>

Ciò si assicura che ciò che si sta tentando di rimuovere sia una directory e non un file:

  1. -dControlla se esiste già una directory con quel nome. in tal caso, eliminalo.

  2. -fVerificare che non esistano file con questo nome. in tal caso, stampare il messaggio di errore ed uscire.

  3. Crea la nuova directory e l'eco ha esito positivo oppure, se fallisce, l'eco non è riuscita.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.