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


152

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

К счастью, все файлы, которые я хочу переместить, содержат в своих именах определенный идентификатор, поэтому я могу ls | grep IDENTIFIERполучить точный список файлов для перемещения.

Но как я могу выполнить mv file /path/to/dest/folder/сразу, а не один за другим (нужно переместить много файлов)?

Ответы:


101

Если вы хотите переместить 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 для второго подхода, так как он упадет для файлов, включая новые строки
αғsнιη


24

Вы можете использовать подстановочные знаки .

Пример: переместить все файлы с расширением .doc

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

Это переместит все документы в текущем каталоге в определенное место назначения.

редактировать

Ответить на комментарий.

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


2
но список файлов для перемещения не определяется расширением. некоторые из файлов названы: ABC-IDENTIFIER-XYZ.extа некоторые просто IDENTIFIER-XYZ.extимеют разные расширения, в основном xmlили properties.
Гилад Хох

@giladhoch Как насчет отредактированного?
Ачу

@gliadhoch Если вам так удобно использовать grep, вы можете увидеть мой ответ выше / ниже.
зажечь

не будет работать, так как есть другие .xmlфайлы (например), которые я не хочу перемещать.
Гилад Хох

20

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

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

В случае, если файлы разбросаны по разным каталогам, вам нужно только указать путь для каждого файла в команде перемещения


10

Я использую технику Туомаза, но слегка измененную:

mv file1 file2 file3 -t DESTINATION

Я нахожу это легче запомнить и сложнее испортить, так как он использует тот же порядок, что и операция vanilla mv:

mv file1 DESTINATION

Страница руководства для mvне упоминает -tвариант.
Нумен

2
linux.die.net/man/1/mv да, это так
geoyws

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 нелегко превратить в подстановочный знак, или вы хотите использовать grep с более сложным регулярным выражением.
AggieBill

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

5

Если файлы находятся в одном и том же каталоге, вы можете использовать

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

(протестировано в Ubuntu 16.04)


1
Это на самом деле ничего не добавляет к существующим ответам, не правда ли?
десерт

1
просто устраняет необходимость указывать полный путь к каталогу для каждого файла
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 commnad

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.