Вопрос Как перемещать сразу несколько файлов в определенный целевой каталог?


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

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

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


119
2017-11-08 13:13


происхождения




ответы:


Если вы хотите переместить ABC-IDENTIFIER-XYZ.ext или IDENTIFIER-XYZ.xml, вы можете использовать:

mv *IDENTIFIER* ~/YourPath/

* является подстановочным знаком для ноль или более символов, это означает ноль или более символов, с последующим IDENTIFIER, с последующим ноль или более символов,

Это переместит все файлы, которые содержать  IDENTIFIER вы указали.


86
2017-11-08 13:33





Вы можете использовать

mv -t DESTINATION file1 file2 file3

а также

mv -t DESTINATION `ls|grep IDENTIFIER`

работает, но я не уверен, что mv вызывается несколько раз или нет, поскольку grep выводит новую строку для каждого совпадения.


168
2017-11-14 11:07



работает над linux, не уверен, что он будет работать на mac - Alexander Mills
работает над mac и git bash через git для windwows. - Brandt Solovij
Не работает на Mac (10.11.16 El Capitan). Но вы можете просто поставить целевую папку на спину, т. Е. mv file1 file2 ... destination - Sheljohn
-1 для второго подхода, поскольку он будет падать для файлов, включая новые линии - αғsнιη
Почему вы не должны анализировать вывод ls, - dessert


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

Пример: перемещение всех файлов с расширением .doc

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

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

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

Чтобы ответить на комментарий.

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


20
2017-11-08 13:21



но список файлов для перемещения не определяется расширением. некоторые из файлов названы: ABC-IDENTIFIER-XYZ.ext и некоторые просто IDENTIFIER-XYZ.ext все имеющие разные расширения, в основном xml или properties, - gilad hoch
@giladhoch Как насчет отредактированного? - Achu
@gliadhoch Если вам так удобно использовать grep, вы можете увидеть мой ответ выше / ниже. - ignite
не будет работать, поскольку есть другие .xml файлы (например), я не хочу двигаться. - gilad hoch


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

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

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


15
2018-03-26 04:03





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

mv file1 file2 file3 -t DESTINATION

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

mv file1 DESTINATION

10
2018-01-20 16:11



Страница руководства для mv не упоминает -t вариант. - Noumenon
linux.die.net/man/1/mv Да - geoyws


Используйте эту команду:

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

Однако, ls не рекомендуется для такого использования. использование найти вместо этого.


7
2017-11-08 13:44



ls не рекомендуется для такого использования. Если вы хотите перечислить файлы, особенно с помощью grep сзади, использовать find . -name \*IDENTIFIER\*, - NorTicUs
Этот ответ должен был продемонстрировать, как вы можете использовать вывод предыдущей команды в mv. Как упоминалось в ls | grep в вопросе, я просто скопировал его. - ignite
Как указано в @NorTicUs, использование ls не рекомендуется. Кроме того, файлы с пробелами могут вызвать проблему. - Paddy Landau
не разбирайте ls - Zanna


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

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

ls -1 (минус один) гарантирует, что на каждой строке есть только одно имя файла. Если у вас есть скрытые псевдонимы для ls команда может содержать несколько имен файлов в одной строке и непреднамеренно перемещать файл, который вы не собираетесь переместить.


5
2017-11-14 10:05



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


Вы можете использовать вывод из ls для ввода в mv commnad

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

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


2
2017-11-13 19:38



не разбирайте ls - Zanna