Come spostare solo i file in Unix


18

Come posso spostare solo i file semplici (non le directory) da una cartella in Linux in un'altra cartella usando il mvcomando?

Ho provato mv * ~/, ma ha copiato tutto, comprese le directory.


i tuoi commenti menzionano un'ulteriore limitazione: il comando non dovrebbe spostare i file nascosti dalla directory di lavoro corrente. se questo è corretto, potresti modificare la tua domanda per menzionarlo? dicendo "sposta solo i file" ci fa pensare "sposta tutti i file", che include i file nascosti.
Quack Quixote

Risposte:


29

Puoi provare

find . -maxdepth 1 -type f -exec mv {} destination_path \;

2
Wow, qualcuno che sa come usare trova. Per completezza dovresti usare -name [^.] * Nella ricerca, cioè --- trova. -maxdepth 1 -type f -name [^.] * -exec mv {} percorso \;
chris,

NON COPIA-INCOLLA QUESTO NEL TUO SHELL. Il punto e virgola lo farà eseguire immediatamente. :)
Sherwood Callaway,

@SherwoodCallaway Il punto e virgola segna la fine di-exec
dstonek,

4

Sono un tipo "usa un martello per tutto" quindi uso programmi bourne shell per cose che altri usano programmi esterni per ...

for file in * .* 
do
  test -f "$file" && mv "$file" "$HOME"/
done

Ad alcune persone piace fare le cose nel minor numero possibile di battute a macchina, ma sono una dattilografa piuttosto veloce e ho cose come questa integrate nel mio cervello, quindi non è un gran dolore fare questo invece di cercare l'esatto argomenti per trovare ed eseguire e tutto il resto.

YMMV, sebbene ...


grazie per quello lo proverò. ma ho ancora bisogno dell'altra risposta perché è per un progetto che sto facendo in corso su Linux. grazie mille

1
Questa è una risposta alla tua domanda. mv non ha alcuna comprensione di file o directory o file quindici o altri file speciali. mv comprende solo le voci di directory e gli inode e, per quanto riguarda, sono tutti uguali indipendentemente dal tipo di file. Per consentire a mv di spostare solo un tipo specifico di file, è necessario qualcosa come test o find che può effettivamente guardare l'inode per vedere quale sia il file. In altre parole, ti viene posta una domanda trabocchetto se ti viene chiesto di farlo solo con mv.
chris,

1
E dico che mv capisce gli inode solo perché è in grado di spostare un file da un filesystem a un altro, che è tecnicamente un cp quindi un rm, non un mv (che in realtà è solo un ln poi rm). Cerca hardlink e voci di directory.
chris,

2
shorty: questa è una buona risposta, devi usare qualcosa oltre al comando mv (almeno la shell). Si tratta di una base in quanto si ottiene senza programmazione.
Kyle Brandt,

3

@Mereghost è molto vicino. Ecco cosa riesco a spostare tutti i file (inclusi i file nascosti), ma non le directory:

find . -maxdepth 1 -type f -name '*' -exec mv -n {} /destination_path \;

L' .individuazione successiva presuppone che la directory corrente sia l'origine dei file che si desidera spostare. In caso contrario, il comando può essere modificato come segue:

find /source_path -maxdepth 1 -type f -name '*' -exec mv -n {} /dest_path \;

Se vuoi spostare solo file normali e non file nascosti:

find . -maxdepth 1 -type f -name '[!.]*' -exec mv -n {} /dest_path \;

Se vuoi spostare solo file nascosti e non file normali:

find . -maxdepth 1 -type f -name '.*' -exec mv -n {} /dest_path \;

0

Se non hai cartelle con il nome con un punto, puoi spostarle tutte semplicemente:

mv . ~ / DestinationFolder

(La mia ipotesi è che tutti i tuoi file siano qualcosa. Qualcosa (nel mio caso lo sono tutti di solito))

MA grazie ad altre risposte - molto utile. grazie


-1

puoi usare find

find * -maxdepth 1 -type f -exec mv {} ~ \;

sì, ha funzionato, ma non al 100%, ha copiato tutti i file da directory e directory secondarie a ~ / location. ho bisogno di qualcosa di molto semplice che copi i file senza i file nascosti dalla directory in cui mi trovo in un'altra directory. questo è tutto. grazie per il consiglio in ogni caso

Questo è impossibile con maxdepth come 1.
John T,

risolto in modo da non copiare i file nascosti.
John T,

1
La sintassi su find è quindi trovare una directory e una descrizione delle operazioni e delle cose da abbinare. In genere non si userebbe mai un carattere jolly come find * senza proteggerlo dal globbing (ovvero find / path / to / directory -name goo * -type f.
chris

1
Trova funziona correttamente solo se gli passi un singolo percorso da esaminare. Nel tuo esempio, ad esempio, se ci sono file che iniziano con a - find esploderà inaspettatamente. Stai sempre molto meglio avere un solo programma che legge la voce della directory e, nel tuo esempio, stai usando due programmi diversi (find e shell).
chris,

-2

mv `find ./sourcedir/* -type f` ./destdir


2
Ciò non riuscirà per tutti i file che contengono spazi bianchi nel loro nome. L'output dei comandi che stampano i nomi dei file non deve mai essere analizzato a meno che non si possa garantire che sia delimitato correttamente. Vedi Perché non dovresti analizzare l'output di ls (1) per l'idea principale. Usando find's -execopzione è il modo migliore per evitare il problema.
slhck
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.