Як перемістити декілька файлів одночасно до конкретного каталогу призначення?


152

Я отримав купу файлів у деякому каталозі (разом з багатьма іншими файлами), які хочу перенести.

На щастя, усі файли, які я хочу перемістити, містять у своїх іменах певний ідентифікатор, тому я можу ls | grep IDENTIFIERотримати точний список файлів, які потрібно перемістити.

Але як я можу виконати mv file /path/to/dest/folder/одразу, а не один за одним (для переміщення є багато файлів)?

Відповіді:


100

Якщо ви хочете переїхати ABC-IDENTIFIER-XYZ.extабо IDENTIFIER-XYZ.xml, ви можете скористатися:

mv *IDENTIFIER* ~/YourPath/

*є символом підстановки для нуля або більше символів , це означає нуль або більше символів , за якими IDENTIFIERслідує, а за ними - нуль або більше символів .

Це перемістить усі файли, які містять вказане IDENTIFIERвами.


201

Ви можете використовувати

mv -t DESTINATION file1 file2 file3

і

mv -t DESTINATION `ls|grep IDENTIFIER`

працює, але я не впевнений, що mv викликається кілька разів чи ні, оскільки grep виведе новий рядок для кожного матчу.


5
працює на linux, не впевнений, чи буде він працювати на mac
Олександр Міллс

3
працює над mac та git bash через git для windwows.
Брандт Соловій

11
Не працює на Mac (10.11.16 El Capitan). Але ви можете просто покласти цільову папку ззаду, тобтоmv file1 file2 ... destination
Sheljohn

2
-1 для другого підходу, оскільки він припаде до файлів, включаючи нові рядки
αғsnιη


24

Можна використовувати підстановку .

Приклад: переміщення всіх файлів, що мають розширення .doc

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

Це перемістить весь файл doc у поточному каталозі до конкретного пункту призначення.

Редагувати

Щоб відповісти на коментар.

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


2
але список файлів для переміщення не визначається розширенням. деякі з файлів названі: ABC-IDENTIFIER-XYZ.extа деякі просто IDENTIFIER-XYZ.extвсі мають різні розширення, в основному xmlабо properties.
gilad hoch

@giladhoch Як щодо відредагованого?
Ачу

@gliadhoch Якщо вам так зручно користуватися grep, ви можете побачити мою відповідь вище / нижче.
запалити

не працюватиме, оскільки є інші .xmlфайли (наприклад), які я не хочу пересувати.
gilad hoch

20

У випадку, якщо ви хочете перемістити набір невідповідних файлів (немає загального шаблону в іменах та типах), ви можете зробити так, як сказав пан Раджананд: спершу перейдіть до каталогу, який містить файли, які ви хочете перемістити

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

Якщо файли розкидані в різних каталогах, вам потрібно лише вказати шлях для кожного файлу в команді переміщення


10

Я використовую техніку tuomaz, але трохи модифіковану:

mv file1 file2 file3 -t DESTINATION

Мені це легше запам’ятати і важче викрутити, оскільки він використовує той самий порядок, що і для операції з ванільним mv:

mv file1 DESTINATION

Сторінка "man" для параметра mvне згадує -t.
Номенон


7

Використовуйте цю команду:

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

Однак ls не рекомендується застосовувати для такого виду використання. Використовуйте команду find замість цього.


8
lsне рекомендується для подібного використання. Якщо ви хочете перерахувати файли, особливо grepззаду, використовуйте find . -name \*IDENTIFIER\*.
NorTicUs

Ця відповідь була просто для того, щоб продемонструвати, як можна використовувати вихід попередньої команди в mv. Оскільки в запитанні згадувався ls | grep, я його просто скопіював.
запалити

3
Як зазначає @NorTicUs, використання ls не рекомендується. Також файли з пробілами можуть спричинити проблему.
Падді Ландау


5

Якщо у вас стільки файлів для переміщення, насправді їх може бути занадто багато для mvкоманди (або інших команд на зразок rm). Я пропоную використовувати xargsдля переміщення кожного файлу окремо певний цикл. Один із способів обійти це:

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

ls -1(Мінус один) гарантує , що існує тільки один файл на кожну рядку. Якщо у вас є приховані псевдоніми для lsкоманди, ви можете мати кілька імен файлів в одному рядку і ненавмисно перемістити файл, який ви не збиралися переміщувати.


Це також корисно, коли ваш IDENTIFIER не легко перетвориться на підстановку або ви хочете використовувати греп із складнішим регулярним виразом.
AggieBill

1
+1 для xargs. знайти майже завжди краще і безпечніше, ніж ls. знайти. IDENTIFIER -exec mv {} / шлях / до / dest / папка \; (неперевірений код). є для поточного робочого каталогу. \; - це закінчити команду, яку потрібно виконати. Залежно від того, що ви робите, вам, можливо, доведеться додати -maxdepth 1, щоб він не повторювався у підкаталогах.
Джо

5

Якщо файли знаходяться в одному режимі, ви можете використовувати

mv /path/to/source/dir/{file1,file2,*.ext1,*.ext2} /path/to/destination/

(випробувано в Ubuntu 16.04)


1
Це насправді щось не додає до існуючих відповідей, ви не думаєте?
десерт

1
просто виключає необхідність вказувати повний шлях до dir для кожного файлу
Sruli

3
find -type f -name "[range]" -exec mv {} target-directory ';'

Ця команда перемістить імена файлів з будь-яким шаблоном / діапазоном до цільового каталогу.

напр.

find -type f -name "file[1-50000]" -exec mv {} target-directory ';'

він перемістить файли з іменами типу file1, file2... file50000до target-directory.


2

Ви можете використовувати вихід з ls для введення в mv comnad

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

Команда між $()повертає список імен файлів, що відповідають вашому пошуку, і може бути надана як параметр для команди mv.



1

За допомогою цієї команди ви можете переміщати кілька файлів.

mv SourceFilenames ~DestinationPath


1

Найпростіший спосіб такий

mv {file1,file2,file3} DESTINATION

або каталог

mv {directory1,directory2,directory3} DESTINATION

або обидва файли та каталоги

mv {file1,file2,file3,directory1,directory2,directory3} DESTINATION

Сподіваюсь, це допомагає

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.