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.