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?
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 ..?*
.
Î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
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.
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
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ă.
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
Î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.