Vraag Hoe kan ik mv (of het * jokerteken) krijgen om verborgen bestanden te verplaatsen?


Ik migreem mijn homedirectory van een oud systeem naar een nieuw systeem en de tarball die ik heb gemaakt bevat alles, inclusief verborgen bestanden zoals .bashrc. Als ik echter de inhoud van de uitgepakte tarball (die zich in / tmp) naar mijn nieuwe basismap verplaatst, de verborgen bestanden niet kopiëren (mv /tmp/home/rcook/* /home/rcook/). Hoe kan ik mv krijgen om ze te verplaatsen?

Eigenlijk denk ik dat het probleem niet bij mv ligt, maar bij basb's. Als ik dit doe:

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

Ik zie dit:

a/:
.  ..  .foo

b/:
.  ..  bar

a/.foo bewoog niet. Dus hoe kan ik het * -trubriek krijgen om verborgen bestanden te vinden?

Ja, ik denk dat ik de tarball rechtstreeks in mijn thuismap kan decomprimeren, maar de tarball decomprimeert in home/rcook/...en ik wil er zeker van zijn dat ik het nieuwe overschrijf .bashrc, enz. met de oude, aangepaste versies, en weten hoe verborgen bestanden te vinden en te verplaatsen, is een waardevolle vaardigheid. Iets te melden?


Sommige antwoorden suggereren iets als doen mv src/.* dest/. Ik probeerde dit echter in mijn testdirectory's en kreeg fouten. Beginnend met:

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

Wat doe ik verkeerd?


100
2018-02-21 19:14


oorsprong


unix.stackexchange.com/a/251091/139312 - palindrom


antwoorden:


Je kan dit doen :

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

Je kan zetten

shopt -s dotglob

in uw ~/.bashrc als je wilt dat dit de standaard is.

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


Een andere manier om de puntbestanden te kopiëren:

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

Gebruik het patroon niet ..* zoals het overeenkomt .. (pointer naar de bovenliggende directory). Als er bestanden zijn waarvan de naam begint met twee punten (..something), gebruik ook het patroon ..?*.


114
2018-02-21 19:16



Bekijk de toevoegingen die ik onderaan mijn vraag heb gezet. Bedankt. - Randall Cook
Er is niets aan de hand, . en .. zijn specials mappen: respectievelijk huidig ​​richtsnoer & moederhor. Het is maar een waarschuwing. Beter gebruik shopt -s dotglob oplossing - Gilles Quenot
Ik eindigde met slechts twee zetten: mv home/rcook/* /home/rcook/ gevolgd door mv home/rcook/.* /home/rcook/. Dit heeft de truc gedaan, hoewel ik wou dat ik de link had gevolgd en eerst over de dotglob-modus had gelezen. Het zou me een stap hebben bespaard. 1 - Randall Cook
Dus de tweede benadering vereist het gebruik van absolute paden? - franzlorenzon
Als je gebruikt zsh, je kunt gebruiken de D globbing qualifier of de GLOB_DOTS shell optie. - mgalgs


In je toevoegingen kreeg je fouten maar de code werkte nog steeds. Het enige dat je moet toevoegen is dat je het hebt verteld enkel en alleen om de puntbestanden te kopiëren. Proberen:

mv src/* src/.* dst/

U krijgt nog steeds de fouten voor de. en .. entries, dat is prima. Maar de zet zou moeten slagen.

~/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

23
2018-01-03 18:47



Goede punten, @AndrewSchwartz. Ik hou ook van deze aanpak. Ik denk dat het meer erkenning verdient. - Randall Cook


als jij ls -l in een map, zult u zien . en .. onder de vermelde bestanden. Dat denk ik mv .* /dest houdt rekening met deze aanwijzingen. Proberen:

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

dit zal die huidige en parent dir wijzers negeren.

U krijgt een fout als een van de drie patronen *, [^.]* of ..?* komt niet overeen met een bestand, dus u moet alleen de overeenkomende items opnemen.


10
2018-06-14 12:20



Leuk. Een vergelijkbaar antwoord voor deze stijl van globbing is hier: superuser.com/a/784046/144977 . Bedankt voor het plaatsen van dit. - phyatt


Twee mogelijke oplossingen die ik kan bedenken. De eerste is om in plaats daarvan de cp te gebruiken met zijn recursieve optie, de huidige map naar de bestemming te kopiëren.

cp -Rp . /desired/directory

dan kunt u de bronbestanden in de huidige map verwijderen

Als alternatief, als u weet dat de bestanden de juiste naam hebben (geen spaties, jokertekens, niet-afdrukbare tekens), kunt u zoiets als dit doen

mv $(ls -A) /desired/directory

5
2018-02-21 22:03



Copy-then-remove is heel anders dan verplaatsen als de bron en het doel zich op hetzelfde bestandssysteem bevinden. Geef ten minste de optie op -p om metadata te behouden. Gebruik makend van ls zou een laatste redmiddel moeten zijn, en hier zijn er betere, eenvoudigere manieren. - Gilles


Er bestaat niet echt zoiets als "verborgen" bestanden op Linux. Bestanden die beginnen met een punt worden standaard standaard verborgen uit bestandsvermeldingen.

Om bestanden te kopiëren, zelfs met een glob, moet u het bestand vooraf invoegen met . zoals mv -u .* foo en dan .foo zal verschijnen als foo/.foo wanneer verplaatst.

De optie -u verplaatst alleen de bestanden wanneer de bron nieuwer is of de bestemming ontbreekt. Of je kunt gewoon de fouten over bewegen negeren . en .. omdat het speciale bestanden zijn en niet kunnen worden verplaatst, maar wel worden betrapt in de .*glob door de schaal.


2
2018-02-21 19:17



Bekijk de toevoegingen die ik onderaan mijn vraag heb gezet. Bedankt. - Randall Cook


Dus we hebben:

a
|-- .foo
`-- bar

en:

b

ik nam een reusachtig tijd vinden van betere oplossing dan alle antwoorden hier.

Toen nam ik 30 seconden voor deze opdracht:

$ mv --help

Toen vond ik mijn liefde:

$ mv a/ b/ -T

Opmerking: ik begrijp het argument niet eens -T. Het deed gewoon wat ik nodig had. Hier staat het:

-T, --no-target-directory  behandel DEST als een normaal bestand


0
2017-07-28 00:42



Als u de schuine strepen weglaat, heeft u dit niet nodig -T. Hoe dan ook, dit vertelt in feite mv om de map zelf te verplaatsen, in plaats van alle bestanden erin te verplaatsen. - thomasrutter
@thomasrutter, verplaatst de directory zelf niet hetzelfde als de naam ervan wijzigen? - Randall Cook
Ja, als de bovenliggende bestemming hetzelfde blijft, is deze in feite gewoon de naam ervan. Hoe je het ook noemt, het helpt waarschijnlijk niet bij het beantwoorden van de oorspronkelijke vraag, die ging over het verplaatsen van de bestanden binnen de map naar een bepaalde locatie. - thomasrutter


Als u bestanden inclusief verborgen bestanden naar de huidige map wilt kopiëren waarin u zich bevindt

cp -Rp source-directory/. .

-1
2017-09-05 00:51



Dit lijkt erg op het antwoord van Drake Clarris uit 2013. Heb je nog iets anders toe te voegen? - Randall Cook