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


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.