Linux / Comandi / cp - comando per copiare, mv - comando per spostare

In Linux, cp copia file o directory, e mv sposta file o directory o li rinomina. Il risultato di entrambi i comandi differisce a seconda che il percorso finale sia una directory esistente, quindi dovresti controllare il percorso di destinazione prima di eseguire.

Differenza tra copia e spostamento

I formati di base dei due comandi sono cp source destination e mv source destination. Copiare lascia una copia separata dell'originale, mentre spostare o rinominare rimuove l'elemento dal percorso originale dopo il successo. Gli esempi seguenti si basano su GNU coreutils cp e mv.

I file esistenti possono essere sovrascritti con lo stesso nome, quindi controlla il percorso e il contenuto di destinazione e prepara i backup necessari prima di trattare dati importanti. La pratica sottostante viene condotta in una directory vuota creata di recente.

Preparazione dei file di pratica

L'esempio seguente mostra quando la directory cp-mv-practice non esiste ancora nella posizione corrente. Se una directory con lo stesso nome esiste già, pratica in un'altra posizione vuota. Se il primo comando fallisce, non procedere con i comandi successivi.

mkdir cp-mv-practice
cd cp-mv-practice
printf 'Hello Linux\n' > note.txt
mkdir target
ls

Vengono visualizzati il file note.txt e una directory vuota target. Gli esempi successivi vengono eseguiti in ordine in questa directory. > di printf sovrascriverà i contenuti se esiste un file con lo stesso nome, quindi usalo in una posizione senza dati reali.

Copia dei file

Il comando seguente copia note.txt in copy.txt nella directory corrente. Se ha successo, esisteranno sia l'originale sia la copia.

cp note.txt copy.txt
ls
cat copy.txt

cat mostra il contenuto della copia, Hello Linux. Il seguente comando la copia nella directory esistente target mantenendo il nome originale.

cp note.txt target/
ls target

Se il nome di destinazione specificato non è una directory esistente, potrebbe essere creato un file con quel nome o potrebbe essere sovrascritto un file esistente. Pertanto, se target è una directory, cp note.txt target vi copia il file, ma se non esiste, verrà creato un file chiamato target. Per copiarlo con un nome diverso all'interno di una directory, specificare il percorso completo di destinazione come mostrato in cp note.txt target/other.txt.

Copia di Directory

Usare l'opzione ricorsiva -r quando si copia una directory e il suo contenuto. Il seguente comando copia la directory precedentemente creata target in target-copy, che non esiste ancora.

cp -r target target-copy
ls target-copy

Di conseguenza, viene creato target-copy/note.txt e l'originale target/note.txt rimane. Al contrario, se la directory di destinazione esiste già, la directory originale viene di solito posta al suo interno. Ad esempio, eseguire nuovamente cp -r target target-copy può creare target-copy/target. Controlla la destinazione con ls prima di eseguire.

GNU cp -a cerca di preservare attributi come collegamenti, permessi e timestamp il più possibile durante le copie ricorsive. Non tutti gli attributi sono garantiti di essere preservati, a seconda dei permessi o del supporto del file system di destinazione. La gestione dei collegamenti simbolici varia anche in base alle opzioni, quindi verifica i dati importanti dopo la copia. Per ulteriori dettagli, fare riferimento al manuale GNU cp.

Spostamento e rinominazione dei file

Il comando seguente rinomina lo copy.txt precedentemente creato in renamed.txt. Se ha successo, copy.txt scompare e viene visualizzato renamed.txt.

mv copy.txt renamed.txt
ls

Successivamente, sposta il file in una directory esistente. renamed.txt non esiste più nella sua posizione originale, e viene creato target/renamed.txt.

mv renamed.txt target/
ls target

Quando si sposta o si rinomina una directory, usa mv, e -r di cp non è necessario. Se la directory di destinazione esiste già, viene spostata al suo interno e, se la destinazione non esiste, viene spostata con il nome specificato. Se entra in conflitto con una directory esistente non vuota, potrebbe fallire, quindi non assumere che si unisca come la copia.

Tra diversi sistemi di file, GNU mv può gestirlo cancellando l'originale dopo la copia. I dati di grandi dimensioni possono richiedere tempo, e se fallisce a metà, solo una parte potrebbe spostarsi, quindi controlla i risultati da entrambe le parti. Puoi consultare le condizioni dettagliate nel manuale GNU mv.

Sovrascrittura e controlli degli errori di percorso

Per ricevere conferma prima di sovrascrivere un file esistente, usa -i. Seguente è uno scenario pratico in cui esiste già un file con lo stesso nome. Quando compaiono le istruzioni, leggile e approva solo se intendi sovrascrivere.

cp -i note.txt target/note.txt

mv -i chiede anche prima di sostituire un file di destinazione esistente. La conferma interattiva non sostituisce la gestione dei conflitti negli script automatizzati, quindi negli script, controllare separatamente il comportamento previsto e lo stato di uscita. Il comportamento predefinito può differire negli ambienti in cui i comandi sono impostati come alias.

  • Quando ci sono spazi nel percorso: Racchiudere ogni percorso tra virgolette come in cp "my file.txt" "target/my file.txt".
  • Quando un file o una directory non può essere trovato: Controllare la posizione corrente, l'ortografia e il maiuscolo/minuscolo usando pwd e ls.
  • Quando si verifica un errore di autorizzazione: Verifica di avere il permesso di lettura per la sorgente e il permesso di scrittura per la destinazione, e controlla anche i permessi richiesti nella directory di origine durante lo spostamento. Se non hai i permessi, richiedili all'amministratore.

Dopo aver verificato i risultati pratici, se necessario, puoi rimuovere la directory cp-mv-practice utilizzando uno strumento di gestione file. Esistono anche strumenti come Midnight Commander che consentono di copiare e spostare file mentre si visualizza l'elenco dei file, ma se siano installati sul server e le autorizzazioni d'uso dipendono dall'ambiente.