GNU/Linux >> Linux Esercitazione >  >> Linux

Come spostare tutti i file dalla directory corrente alla directory superiore?

Il comando che stai cercando è

mv * .[^.]* ..

o (vedi sotto per maggiori informazioni):

(shopt -s dotglob; mv -- * ..)

Spiegazione:il mv comando sposta file e directory. L'ultimo argomento di mv è l'obiettivo (in questo caso la directory un gradino "sopra" nell'albero, .. ). Gli argomenti precedenti sono i file e le directory di origine. L'asterisco (* ) è un carattere jolly che corrisponde a tutti i file che non iniziano con un punto. I file che iniziano con un punto (dotfiles) sono "nascosti". Vengono abbinati utilizzando il pattern .[^.]* (vedi modifica sotto).

Vedi la manpage che ho collegato per maggiori informazioni su mv .

Perché .[^.]* invece di .* ?

Come sottolinea correttamente Chris Johnsen:il modello .* corrisponde anche a . e .. . Dal momento che non vuoi (e non puoi) spostarli, è meglio usare uno schema che corrisponda a qualsiasi nome di file che inizi con un punto tranne quei due . Il modello .[^.]* fa proprio questo:corrisponde a qualsiasi nome di file (1) che inizia con un punto (2) seguito da un carattere che è non un punto (3) seguito da zero o più caratteri arbitrari.

Come sottolinea Paggas, dovremmo anche aggiungere il pattern .??* per far corrispondere i file che iniziano con due punti. Vedi la sua risposta per una soluzione alternativa usando find .

La risposta di Arjan menziona shopt per evitare tutti quei problemi con i dotfile. Ma poi c'è ancora il problema con i file che iniziano con un trattino. E richiede tre comandi. Comunque mi piace l'idea. Propongo di usarlo in questo modo:

(shopt -s dotglob; mv -- * ..)

Questo esegue shopt in una subshell (quindi nessuna seconda chiamata a shopt richiesto) e usa -- in modo che i file che iniziano con un trattino non vengano interpretati come argomenti di mv .


Risposta breve:usa

find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +

Risposta lunga:

Il comando

mv * .* ..

non funzionerà dal .* può corrispondere a . e .. . Ma il comando

mv * .[^.]* ..

inoltre non funzionerà, poiché .[^.]* non corrisponderà, ad esempio, ..filename ! Invece, quello che faccio è

mv * .[^.] .??* ..

che corrisponderà a tutto tranne . e .. . * corrisponderà a tutto ciò che non inizia con . , .[^.] corrisponderà a tutti i nomi di file di 2 caratteri che iniziano con un punto tranne .. e .??* corrisponderà a tutti i nomi di file che iniziano con un punto con almeno 3 caratteri.

Meglio ancora, puoi usare

find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +

che evita i brutti hack glob in mv * .[^.] .??* .. !


Giusto per completezza, si può anche dire alla shell Bash di includere i file nascosti, usando shopt :

shopt -s dotglob
mv -- * ..
shopt -u dotglob

Linux
  1. Come trovare un file in Linux in tutte le directory in modo ricorsivo

  2. Stampa tutti i file in una cartella?

  3. Come eliminare tutti i file con un'estensione particolare in una cartella particolare?

  4. Come spostare tutti i file di origine Java nella rispettiva directory del pacchetto?

  5. Decomprimere tutti i file in una directory

Come spostare tutti i file inclusi i file nascosti nella directory principale tramite *

Come chown/chmod tutti i file nella directory corrente?

Come eliminare tutti i file in una directory tranne alcuni?

Come creare collegamenti simbolici a tutti i file (classe di file) in una directory?

Come spostare tutti i file e le cartelle tramite il comando mv

Come posso eliminare tutti i file da una directory quando segnala che l'elenco degli argomenti è troppo lungo