Cum pot obține mv (sau * wildcard) pentru a muta fișiere ascunse?

Sunt migratoare directorul meu acasă de la un sistem vechi cu unul nou, și tar-am facut conține totul, inclusiv fișierele ascunse de genul .bashrc. Cu toate acestea, atunci când am muta conținutul despachetat tar (care sunt în /tmp) spre noua mea casă director, fișierele ascunse nu copiați (mv /tmp/home/rcook/* /home/rcook/). Cum pot obține mv pentru a le muta?

De fapt, cred că problema nu este cu mv, dar cu bash's expandarea. Dacă am face acest lucru:

mkdir a
mkdir b
touch a/.foo
touch a/bar
mv a/* b/
ls -a a/ b/

Am văzut asta:

a/:
.  ..  .foo

b/:
.  ..  bar

o/.foo nu se mișcă. Deci cum pot obține * wildcard pentru a găsi fișiere ascunse?

Da, cred că aș putea să decomprima arhiva tar direct in directorul meu acasă, dar tar decomprimă în acasă/rcook/..., și vreau să fiu sigur că am suprascrie noua .bashrc, etc. cu cele vechi, de versiuni personalizate, și știind cum de a găsi și pentru a muta fișiere ascunse este un valoros calificare. Sugestii?


Unele răspunsuri sugera ceva de genul mv src/.* dest/. Cu toate acestea, am incercat asta pe testul meu directoare și are erori. Incepand cu:

rcook$ ls -a a/ b/
a/:
.  ..  bar  .foo

b/:
.  ..
rcook$ mv a/.* b/
mv: cannot move 'a/.' to 'b/.': Device or resource busy
mv: cannot remove 'a/..': Is a directory
rcook$ ls -a a/ b/
a/:
.  ..  bar

b/:
.  ..  .foo

Ce fac gresit?

Comentarii la întrebare (1)
Soluția

Puteți face acest lucru :

shopt -s dotglob
mv /tmp/home/rcook/* /home/rcook/

Puteți pune

shopt -s dotglob

în~/.bashrc` dacă vrei să fie implicit.

Vezi http://mywiki.wooledge.org/glob


O altă abordare pentru a copia fișierele dot:

mv /tmp/home/rcook/.[!.]* /home/rcook/

Don't de a folosi modelul ..* ca se potriveste .. (pointer la directorul părinte). Dacă există fișiere al căror nume începe cu două puncte (ceva), de asemenea, utiliza modelul ..?*.

Comentarii (9)

În completări, ai erori, dar codul încă lucrat. Singurul lucru pentru a adăuga este că ai spus-o doar pentru a copia fișierele dot. Încercați:

mv src/* src/.* dst/

Veți primi în continuare erori . și .. de intrări, ceea ce este bine. Dar mutarea ar trebui să reușească.

~/scratch [andrew] $ mv from/* from/.* to/
mv: cannot move ‘from/.’ to ‘to/.’: Device or resource busy
mv: cannot remove ‘from/..’: Is a directory
~/scratch [andrew] $ ls -a from/ to/
from/:
.  ..

to/:
.  ..  test  .test
Comentarii (3)

Dacă tu ls-l intr-un director, veți vedea . și .. printre fișierele enumerate. Deci, cred că mv .* /dest ia aceste indicii în considerare. Încercați:

mv /tmp/home/rcook/{*,.[^.]*,..?*} /home/rcook/

acest lucru va ignora acele curente și părinte dir indicii.

Veți obține o eroare dacă oricare dintre cele trei modele*, [^.]* sau..?*` se potrivește nici un fișier, astfel încât ar trebui să includă doar cele care se potrivesc.

Comentarii (1)

Două soluții posibile care mă pot gândi. Primul este de a utiliza cp în loc cu recursiv opțiune, copierea directorul curent la destinație.

cp -Rp . /desired/directory

apoi, puteți elimina fișierele sursă în directorul curent

Alternativ, dacă știi fișierele sunt sanely nume (fără spații, metacaractere, caractere non-printabile), puteți face ceva de genul asta

mv $(ls -A) /desired/directory
Comentarii (1)

Nu e't într-adevăr un astfel de lucru ca "ascunse" fișiere pe Linux. Fișierele care încep cu un punct sunt doar ascunse de fișier listări în mod implicit.

Pentru a copia fișiere chiar și cu un glob, trebuie să prefix fișier cu . cum ar fi mv -u .* foo "și apoi".foo va appearn ca foo/.foo când s-a mutat.

A-u opțiune va muta numai fișiere atunci când sursa este mai nou, sau destinație lipsește. Sau ai putea ignora erorile despre mutarea . și .. deoarece acestea sunt fișiere speciale și nu pot fi mutate, dar nu prins în .* glob de coajă.

Comentarii (1)

Deci, avem:

a
|-- .foo
`-- bar

și:

b

Mi-am luat o mare timp de găsirea unor soluții mai bune decât toate răspunsurile aici.

Apoi mi-am luat 30 de secunde pentru această comandă:

$ mv --help

Apoi am găsit dragostea mea:

$ mv a/ b/ -T

Notă: eu nu't chiar înțeleg argumentul -T. A făcut doar ceea ce am nevoie. Aici se spune:

-T, --nu-țintă-director ` ` trata DEST ca un fișier obișnuit

Comentarii (3)

În cazul meu, am fost pur și simplu încercarea de a mv un singur fișier ascuns și asta a fost soluția:

FILE=.myHiddenFile mv "$FILE" dest/

Explicație

La început am încercat:

mv .myHiddenFile dest/

Dar ea a continuat să producă eroarea:

mv: nu se poate de stat '.myHiddenFile': Nu există un astfel de fișier sau director

Chiar dacă o e -al a arătat că fișierul și dest/ a existat.

Motivul pare a fi faptul că shell a fost interpretarea "." în numele de fișier, astfel încât, prin mutarea la o variabilă se evită interpretarea. Probabil că există și alte modalități de a rezolva acest lucru, dar acest lucru a fost suficient pentru noi.

Comentarii (0)

Dacă doriți să copiați fișierele, inclusiv fișierele ascunse de la directorul curent în care vă aflați.

cp -Rp source-directory/. .
Comentarii (1)