Come posso ottenere mv (o il carattere jolly *) per spostare file nascosti?

98

Sto migrando la mia home directory da un vecchio sistema a uno nuovo, e il tarball che ho creato contiene tutto, inclusi i file nascosti come .bashrc. Tuttavia, quando sposto il contenuto del tarball decompresso (che si trova in / tmp) nella mia nuova home directory, i file nascosti non vengono copiati ( mv /tmp/home/rcook/* /home/rcook/ ). Come posso ottenere mv per spostarli?

In realtà, penso che il problema non sia con mv, ma con bash's globbing. Se faccio questo:

mkdir a
mkdir b
touch a/.foo
touch a/bar
mv a/* b/
ls -a a/ b/

Questo lo vedo:

a/:
.  ..  .foo

b/:
.  ..  bar

a/.foo non si è mosso. Quindi, come posso ottenere il carattere jolly * per trovare i file nascosti?

Sì, suppongo che potrei decomprimere il tarball direttamente nella mia home directory, ma il tarball decomprime in home/rcook/... , e voglio essere sicuro di sovrascrivere il nuovo .bashrc , ecc. con le vecchie versioni personalizzate, e sapere come trovare e spostare file nascosti è un'abilità utile. Suggerimenti?

Alcune risposte suggeriscono di fare qualcosa come mv src/.* dest/ . Tuttavia, ho provato questo sulle mie directory di test e ho ottenuto degli errori. A partire da:

rcook$ ls -a a/ b/
a/:
.  ..  bar  .foo

b/:
.  ..
rcook$ mv a/.* b/
mv: cannot move 'a/.' to 'b/.': Device or resource busy
mv: cannot remove 'a/..': Is a directory
rcook$ ls -a a/ b/
a/:
.  ..  bar

b/:
.  ..  .foo

Che cosa sto sbagliando?

    
posta Randall Cook 21.02.2013 - 20:14

7 risposte

111

Puoi fare ciò:

shopt -s dotglob
mv /tmp/home/rcook/* /home/rcook/

Puoi mettere

shopt -s dotglob

nel tuo ~/.bashrc se vuoi che sia l'impostazione predefinita.

Vedi link

Un altro approccio per copiare i file di punti:

mv /tmp/home/rcook/.[!.]* /home/rcook/

Non utilizzare il modello ..* poiché corrisponde a .. (puntatore alla directory padre). Se ci sono file il cui nome inizia con due punti ( ..something ), usa anche il pattern ..?* .

    
risposta data Gilles Quenot 21.02.2013 - 20:16
22

Nelle tue aggiunte hai ricevuto degli errori ma il codice funzionava ancora. L'unica cosa da aggiungere è che hai detto a solo di copiare i file di punti. Prova:

mv src/* src/.* dst/

Riceverai comunque gli errori per. e .. le voci, che va bene. Ma la mossa dovrebbe riuscire.

~/scratch [andrew] $ mv from/* from/.* to/
mv: cannot move ‘from/.’ to ‘to/.’: Device or resource busy
mv: cannot remove ‘from/..’: Is a directory
~/scratch [andrew] $ ls -a from/ to/
from/:
.  ..

to/:
.  ..  test  .test
    
risposta data Andrew Schwartz 03.01.2014 - 19:47
9

Se ls -l in una directory, vedrai . e .. tra i file elencati. Quindi, penso che mv .* /dest tenga conto di quei puntatori. Prova:

mv /tmp/home/rcook/{*,.[^.]*,..?*} /home/rcook/

questo ignorerà quei puntatori dir correnti e padre.

Riceverai un errore se uno dei tre modelli * , [^.]* o ..?* non corrisponde a nessun file, quindi dovresti includere solo quelli corrispondenti.

    
risposta data Azamat 14.06.2014 - 14:20
5

Due possibili soluzioni a cui posso pensare. Il primo è usare cp invece con la sua opzione ricorsiva, copiando la directory corrente nella destinazione.

cp -Rp . /desired/directory

quindi puoi rimuovere i file sorgente nella directory corrente

In alternativa, se sai che i file sono ben definiti (non spazi, caratteri jolly, caratteri non stampabili), puoi fare qualcosa di simile

mv $(ls -A) /desired/directory
    
risposta data Drake Clarris 21.02.2013 - 23:03
2

In realtà non esiste una cosa come i file "nascosti" su Linux. I file che iniziano con un punto sono appena nascosti dagli elenchi dei file per impostazione predefinita.

Per copiare i file anche con un glob, devi prefisso il file con . come mv -u .* foo e poi .foo apparirà n come foo/.foo quando spostato.

L'opzione -u sposta i file solo quando la sorgente è più recente o manca la destinazione. Oppure puoi semplicemente ignorare gli errori relativi allo spostamento di . e .. poiché sono file speciali e non possono essere spostati, ma rimangono intrappolati nel .* glob dalla shell.

    
risposta data dobey 21.02.2013 - 20:17
0

Quindi abbiamo:

a
|-- .foo
'-- bar

e

b

Ho impiegato un enorme tempo a trovare una soluzione migliore di tutte le risposte qui.

Poi ho preso 30 secondi per questo comando:

$ mv --help

Poi ho trovato il mio amore:

$ mv a/ b/ -T

Nota: non capisco nemmeno l'argomento -T . Ha fatto solo ciò di cui avevo bisogno. Qui dice:

  

-T, --no-target-directory considera DEST come un file normale

    
risposta data user433901 28.07.2015 - 02:42
-1

Se vuoi copiare i file inclusi i file nascosti nella directory corrente in cui ti trovi.

cp -Rp source-directory/. .
    
risposta data Rick 05.09.2016 - 02:51

Leggi altre domande sui tag