Come spostare tutti i file dalla directory corrente alla directory superiore in Linux?
Ho provato qualcosa del genere mv *.*
, ma non funziona.
Come spostare tutti i file dalla directory corrente alla directory superiore in Linux?
Ho provato qualcosa del genere mv *.*
, ma non funziona.
Risposte:
Il comando che stai cercando è
mv * .[^.]* ..
oppure (vedi sotto per maggiori informazioni):
(shopt -s dotglob; mv -- * ..)
Spiegazione: il mv
comando sposta file e directory. L'ultimo argomento a mv
è la destinazione (in questo caso la directory un passo "su" nella struttura ad 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 (dotfile) sono "nascosti". Sono abbinati usando il modello .[^.]*
(vedi modifica sotto).
Vedi la manpage che ho collegato per maggiori informazioni mv
.
.[^.]*
invece di .*
?Come sottolinea correttamente Chris Johnsen : anche il modello .*
corrisponde .
e ..
. Dato che non vuoi (e non puoi) spostarli, è meglio usare un modello che corrisponda a qualsiasi nome di file che inizia 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 modello per abbinare i file che iniziano con due punti. Vedi la sua risposta per una soluzione alternativa che utilizza ..??*
find
La risposta di Arjan menziona shopt
al fine di evitare tutti quei problemi con 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 viene eseguito shopt
in una subshell (quindi nessuna seconda chiamata a shopt
richiesta) e utilizza in --
modo che i file che iniziano con un trattino non vengano interpretati come argomenti mv
.
.*
potrebbe far sì che mv produca avvisi / errori in merito alla mancata possibilità di spostamento .
e ..
. Potresti provare mv * .[^.]* ..
invece.
*
, .[^.]*
e ..?*
. Il secondo forse .[!.]*
per le shell più vecchie (POSIX). Leggi anche
Risposta breve: usare
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
Risposta lunga:
Il comando
mv * .* ..
non funzionerà poiché .*
può corrispondere .
e ..
. Ma il comando
mv * .[^.]* ..
inoltre non funzionerà, poiché .[^.]*
non corrisponderà, ad es. ..filename
! Invece, quello che faccio è
mv * .[^.] .??* ..
che corrisponderà a tutto tranne .
e ..
. *
corrisponderà a tutto ciò che non inizia con a .
, .[^.]
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 di almeno 3 caratteri.
Meglio ancora, puoi usare
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
che evita i brutti attacchi di glob mv * .[^.] .??* ..
!
..?*
al mio commento e te ne eri già occupato.
mv
di smettere di cercare ulteriori opzioni di comando. Le parentesi graffe sono un nome file risultante. Il segno più indica invece di eseguire exec per risultato (es. Per nome file), inserire quanti più risultati in un singolo exec possibile. Per completezza, -t..
sta dicendo di spostare la destinazione di destinazione in cui spostare tutti questi file.
Solo per completezza, si può anche dire alla shell Bash di includere file nascosti, usando shopt
:
shopt -s dotglob
mv -- * ..
shopt -u dotglob
Il mv non ha la funzionalità di spostare i file nascosti quando si usa *
- quindi perché non usare copia invece?
cp -rf . ..
rm -rf *
Non è necessario entrare in soluzioni complesse di dotglobbing e utilizzare i comandi find.
rsync -a --remove-source-files . ..
rsync
è uno strumento di copia dei file estremamente potente, generalmente utilizzato per eseguire backup e mirror remoti incrementali efficienti.
Con il comando sopra, stiamo dicendo rsync
di copiare il contenuto di .
in..
Lo switch -a
abilita la ricorsione in .
sottodirectory e abilita alcune altre opzioni comuni.
Lo switch --remove-source-files
dice a rsync di rimuovere i file sorgente dopo una copia corretta, ovvero fa sì che rsync si comporti in modo simile al mv
comando.
--remove-source-files
non rimuoverà le directory (sincronizzate).
-bash: /bin/mv: Argument list too long
errore. Questo funziona come il fascino.
Alla fine il tentativo mv .
fallirà perché mv non sarà in grado di scollegare la directory in cui ci si trova attualmente. È possibile mv * ..
spostare i file nel CWD.
mv * .??* ../.
*
ottiene tutti i file non a punti. .??*
ottiene tutto. file lunghi almeno tre byte, che funzionano per tutti quelli legittimi. Qualunque cosa ti sia rimasta, probabilmente vuoi rm
piuttosto che mv
comunque.
Il ../.
non offre alcun beneficio diretto sopra ..
, ma quando si fa una mossa-to-directory che è una buona abitudine per entrare, perché fallirà, come si vuole, se c'è qualcosa di sbagliato con il percorso. Ad esempio, mv xyz bletch
dove pensi che bletch
sia una directory, puoi essere più sicuro con mv xyz bletch/.
.
.[^.]
per ottenere file di copertina come .a
.
Questo comando minimizzato funziona sulla maggior parte delle shell moderne:
\mv -- {,.{[^.],??}}* ..
Altrimenti menzionato è una soluzione portatile:
\mv -- * .[^.] .??* ..
Caratteristiche:
\ impedisce agli alias di alterare indesiderabilmente mv.
- impedisce che i nomi di file contenenti trattini iniziali (-xyz) vengano interpretati come argomenti della riga di comando.
. [^.] corrisponde a tutti e due i nomi dei file dei caratteri che iniziano con. tranne ..
. ?? * corrisponde a tutti gli altri nomi di file di tre caratteri o più.
Implementazioni ingenui:
Di seguito vengono ignorati i nomi file UNIX nascosti, quelli che iniziano con. (.Bashrc).
mv * ..
Le seguenti corrispondenze .. che tentano in modo ricorsivo di spostare tutte le directory alla fine in / in .. della directory di lavoro corrente ($ PWD o pwd). Non usare mai
mv .* ..
È più corretto usare il modello * .[!.] .??*
che da * .[^.] .??*
quando il primo funzionerà anche con shell più vecchie come ksh88:
mv -- * .[!.] .??* ..
--
impedisce problemi quando si dispone di un nome file che inizia con -
*
corrisponde a tutti i nomi di file che non iniziano con a .
.
che puoi / dovresti spostare.[!.]
corrisponde a tutti e due i nomi dei file dei caratteri che iniziano con a .
.??*
corrisponde a tutti e tre i nomi dei file di caratteri (o più lunghi) che iniziano con a .
Con ksh88, il modello del nome file .[^.]
corrisponderà infatti ai nomi dei file ..
(che esiste sempre) e .^
(che probabilmente non esiste), con un effetto opposto a quello desiderato.
Trova e grep funzionano anche. Questo tipo di struttura potrebbe essere utile se si desidera selezionare i file su criteri più complicati modificando find ed egrep.
find -maxdepth 1 | egrep '^./.' # Returns all files
mv `find -maxdepth 1 | egrep '^./.'` .. # mv <all files> ..
Penso che la soluzione più semplice per spostare tutti i file nella sua directory principale. sarebbe
mv "`ls`" ../
oppure, se ci sono file / directory nascosti
uso:
mv "`ls -a`" ../ 2>/dev/null
Inoltre, supponiamo che tu voglia spostare il contenuto di alcune cartelle in una delle sue cartelle interne tony (diciamo)
uso:
mv "`ls -a`" /tony 2>/dev/null
Nota:
"`ls -a`"
Per spostare i file che contengono spazi.
2>/dev/null
Serve a sopprimere l'avviso / errore perché ls -a
stampa il .
e..
cartella come bene e non è possibile spostare o copiare loro. Quindi per quelle cartelle mostrerà un errore (se non usiamo 2> / dev / null) che non può spostarle e il resto verrà spostato abbastanza comodamente.
Meglio evitare ls -a
se non ci sono file nascosti e basta usare ls
.
mv $(ls -a)
? Ciò toccherebbe la directory corrente e la directory sottostante, perché anche l' ls -a
output verrà emesso ..
.
mv ls -a ../
avrebbe anche funzionato secondo necessità, Sì, mostrerà quegli errori come ho detto sopra, ma a parte questo, sposterà le cartelle / i file richiesti nella directory principale.
ls
comando per spostare i file con spazi. Ho apportato le modifiche richieste. Grazie per averlo segnalato.
[linux] [mv] [cwd] [files]
qualcosa di simile?