Come spostare ricorsivamente tutti i file (incluso nascosto) in una sottocartella in una cartella principale in * nix?


14

Questa è una domanda un po 'imbarazzante, ma devo ammettere che alla fine della mia carriera ho ancora domande sul comando mv.

Ho spesso questo problema: devo spostare tutti i file in modo ricorsivo di un livello. Diciamo che ho una cartella foo e una barra delle cartelle al suo interno. Bar ha un casino di file e cartelle, inclusi file e cartelle punti. Come faccio a spostare tutto nella barra al livello foo?

Se foo è vuoto, sposto semplicemente la barra di un livello sopra, elimino foo e rinomino la barra in foo. Parte del problema è che non riesco a capire quale sia il jolly di mv per "tutto compreso i punti". Una parte di questa domanda è questa: c'è una discussione approfondita dei caratteri jolly che i comandi cp e mv usano da qualche parte (google questo porta solo tutorial molto basilari).

Risposte:


19

In Bash (e in alcuni altri), puoi utilizzare l'espansione del controvento per ottenere questo risultato in una riga:

mv bar/{,.}* .

La virgola separa un nullo e un punto, quindi il mvcomando vede i nomi dei file che corrispondono *e.*


anche questo tenta di spostare '..', fallisce con il messaggio 'la risorsa è occupata'. Funziona comunque.
Xananax,

3
Suggerito da un utente anonimo:To eliminate the error caused by also matching "." and "..", use this command: mv bar/{,.[!.],..?}* .
HopelessN00b

2

Il modo più semplice per farlo è eseguirlo in due comandi, perché * non corrisponde a .whatever

cd /foo
mv bar/* ./
mv bar/.??* ./

Non vuoi usare bar /.* che ho scoperto commettendo questo errore:

rm -rf ./.* 

Questa è una cosa cattiva. Qualcuno vuole indovinare perché? ;-)


Non penso che Bash o Zsh si espandano .*in .e ... Zsh non fa per me almeno.
Mikael S,

Mikael: Posso promettere che bash lo fa (o almeno lo ha fatto), poiché ho dovuto recuperare le directory degli utenti che ho cancellato facendo proprio questo
Matt Simmons,

2

La prima cosa da sapere sul globbing: è fatto dalla shell, non dal comando. Controlla la pagina man della tua shell per tutti i dettagli.


2

Questo raccoglie tutti i file dalle sottocartelle e li sposta nella directory corrente

find . -type f -exec mv -iv \{} . \;

Se si desidera owerwrite i file con lo stesso nome, utilizzare

yes y | find . -type f -exec mv -iv \{} . \;

1

mv .??* *si occuperà di tutto tranne il punto seguito da un singolo carattere. Se questo è comune per la tua situazione, puoi aggiungere .[a-zA-Z0-9]*. Che ancora lasciare i file con nomi come .;, .^, e .^I(tab). Se devi gestire tutto, devi essere un po 'più complesso.

mv .. `ls -f | egrep -v '^.$|^..$'

0

Se si dispone di una struttura di directory /foo/bar/e si desidera spostare tutti i file in barun passaggio sopra, andare nella bardirectory e digitare quanto segue:

find . -depth -print0 | cpio --null -pvd ../

In generale, penso che cpio(1)sia meglio per questo tipo di attività. Puoi consultare la documentazione dettagliata emettendo info cpionella tua shell.

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.