Vraag Hoe verplaats ik meerdere bestanden tegelijk naar een specifieke doelmap?


Ik heb een aantal bestanden in een map (samen met vele andere bestanden) die ik wil verplaatsen.

Gelukkig bevatten alle bestanden die ik wil verplaatsen een bepaalde identifier in hun naam, dus ik kan het ls | grep IDENTIFIER om de exacte lijst met te verplaatsen bestanden te krijgen.

Maar hoe kan ik uitvoeren? mv file /path/to/dest/folder/ tegelijk, en niet één voor één (er zijn veel bestanden om te verplaatsen)?


118
2017-11-08 13:13


oorsprong




antwoorden:


Als je wilt verhuizen ABC-IDENTIFIER-XYZ.ext of IDENTIFIER-XYZ.xml, je kunt gebruiken:

mv *IDENTIFIER* ~/YourPath/

* is een wildcard voor nul of meer tekens, dit betekent nul of meer tekens, gevolgd door IDENTIFIER, gevolgd door nul of meer tekens.

Hiermee worden alle bestanden verplaatst die bevatten de IDENTIFIER je hebt opgegeven.


85
2017-11-08 13:33





Je zou kunnen gebruiken

mv -t DESTINATION file1 file2 file3

en

mv -t DESTINATION `ls|grep IDENTIFIER`

werkt, maar ik weet niet zeker of mv meerdere keren wordt aangeroepen of niet, omdat grep een nieuwe regel voor elke wedstrijd uitvoert.


166
2017-11-14 11:07



werkt op Linux, niet zeker of het op Mac werkt - Alexander Mills
werkt op mac en git bash via git voor windwows. - Brandt Solovij
Werkt niet op Mac (10.11.16 El Capitan). Maar je kunt eenvoudig de doelmap achterop plaatsen, d.w.z. mv file1 file2 ... destination - Sheljohn
-1 voor tweede benadering aangezien het voor bestanden inclusief valt nieuwe lijnen - αғsнιη
Waarom zou je de output van niet moeten analyseren? ls. - dessert


Je kunt gebruiken wildcards.

Voorbeeld: om alle bestanden met de extensie .doc te verplaatsen

mv *.doc /path/to/dest/folder/

Dit verplaatst alle doc-bestanden onder de huidige map naar de specifieke bestemming.

Bewerk

Om de opmerking te beantwoorden.

mv *.ext *.xml *.txt /path/to/dest/folder/


20
2017-11-08 13:21



maar de lijst met te verplaatsen bestanden wordt niet bepaald door extensie. sommige bestanden hebben de naam: ABC-IDENTIFIER-XYZ.ext en sommige gewoon IDENTIFIER-XYZ.ext allemaal met verschillende extensies xml of properties. - gilad hoch
@giladhoch Hoe zit het met de bewerkte? - Achu
@gliadhoch Als je je zo op je gemak voelt met grep, kun je mijn antwoord hierboven / hieronder zien. - ignite
zal niet werken omdat er andere zijn .xml bestanden (bijvoorbeeld) die ik niet wil verplaatsen. - gilad hoch


In het geval dat u een aantal irrelevante bestanden wilt verplaatsen (geen gemeenschappelijk patroon in de namen en typen), kunt u doen wat Mr. Rajanand zei: ga eerst naar de map met de bestanden die u wilt verplaatsen

mv file1.ext1 file2.ext2 file3.ext3.. /destination/

Als de bestanden in verschillende mappen zijn verspreid, hoeft u alleen het pad voor elk bestand in de opdracht move op te geven


15
2018-03-26 04:03





Ik gebruik de techniek van tuomaz, maar licht aangepast:

mv file1 file2 file3 -t DESTINATION

Ik vind dit gemakkelijker te onthouden en moeilijker te verknoeien omdat het dezelfde volgorde gebruikt als de vanilla mv-bewerking:

mv file1 DESTINATION

10
2018-01-20 16:11



De manpagina voor mv vermeldt niet a -t keuze. - Noumenon
linux.die.net/man/1/mv Ja dat doet het - geoyws


Gebruik deze opdracht:

mv `ls|grep IDENTIFIER` /path/to/dest/folder  

Het is echter niet aan te raden voor dit soort gebruik. Gebruik vind commando in plaats daarvan.


7
2017-11-08 13:44



ls wordt niet aanbevolen voor dit soort gebruik. Als u bestanden wilt weergeven, vooral met een grep achter, gebruik find . -name \*IDENTIFIER\*. - NorTicUs
Dit antwoord was alleen om te laten zien hoe je de uitvoer van het vorige commando in mv kunt gebruiken. Aangezien ls | grep in de vraag werd genoemd, heb ik het zojuist gekopieerd. - ignite
Zoals aangegeven door @NorTicUs, is het gebruik van ls slecht aan te raden. Bestanden met spaties kunnen ook een probleem veroorzaken. - Paddy Landau
niet ontleden ls - Zanna


Als je zoveel bestanden moet verplaatsen, kun je er eigenlijk te veel voor hebben mv commando (of andere commando's zoals rm). Ik stel voor om te gebruiken xargs om elk bestand afzonderlijk in een lus-achtige manier te verplaatsen. Een manier om erachter te komen dat is om te doen:

ls -1 | grep IDENTIFIER | xargs -i mv {} /path/to/dest/folder/

De ls -1 (minus één) zorgt ervoor dat er slechts één bestandsnaam op elke regel staat. Als u verborgen aliassen voor de ls commando U kunt meerdere bestandsnamen op één regel plaatsen en per ongeluk een bestand verplaatsen dat u niet wilde verplaatsen.


5
2017-11-14 10:05



Dit is ook handig als uw IDENTIFIER niet gemakkelijk in een wildcard wordt omgezet, of als u grep met een complexere regex wilt gebruiken. - AggieBill
+1 voor xargs. vinden is bijna altijd beter en veiliger dan ls. vind . IDENTIFIER -exec mv {} / pad / naar / dest / map \; (niet-geteste code) Het. is voor de huidige werkdirectory. De \; is om de opdracht die moet worden uitgevoerd te beëindigen. Afhankelijk van wat u doet, moet u mogelijk een -maxdepth 1 toevoegen om te voorkomen dat deze zich opnieuw in submappen verzamelt. - Joe


U kunt de uitvoer van ls gebruiken om in mv commnad in te voeren

mv $(ls | grep IDENTIFIER) /path/to/dest/dir

Het commando tussen $() retourneert een lijst met de bestandsnamen die overeenkomen met uw zoekopdracht en die kan worden opgegeven als een parameter voor de mv-opdracht.


2
2017-11-13 19:38



niet ontleden ls - Zanna