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

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

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

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

1
задан 24 January 2018 в 13:47

10 ответов

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

mv -t DESTINATION file1 file2 file3

и

mv -t DESTINATION `ls|grep IDENTIFIER`

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

160
ответ дан 25 May 2018 в 04:36

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

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

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

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

Изменить

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

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

16
ответ дан 25 May 2018 в 04:36
  • 1
    но список файлов для перемещения не определяется расширением. некоторые из файлов называются: ABC-IDENTIFIER-XYZ.ext, а некоторые просто IDENTIFIER-XYZ.ext имеют разные расширения, в основном xml или properties. – gilad hoch 8 November 2012 в 19:25
  • 2
    @giladhoch Как насчет отредактированного? – Achu 8 November 2012 в 19:36
  • 3
    @gliadhoch Если вам так удобно использовать grep, вы можете увидеть мой ответ выше / ниже. – ignite 8 November 2012 в 19:47
  • 4
    не будет работать, так как есть другие файлы .xml (например), я не хочу двигаться. – gilad hoch 8 November 2012 в 19:50

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

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

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

13
ответ дан 25 May 2018 в 04:36

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

mv file1 file2 file3 -t DESTINATION

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

[ f2]
10
ответ дан 25 May 2018 в 04:36

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

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

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

7
ответ дан 25 May 2018 в 04:36
  • 1
    ls не рекомендуется для такого использования. Если вы хотите перечислить файлы, особенно с grep сзади, используйте find . -name \*IDENTIFIER\*. – NorTicUs 8 November 2012 в 19:48
  • 2
    Этот ответ должен был продемонстрировать, как вы можете использовать вывод предыдущей команды в mv. Как упоминалось в ls | grep в вопросе, я просто скопировал его. – ignite 8 November 2012 в 19:50
  • 3
    Как указано в @NorTicUs, использование ls не рекомендуется. Кроме того, файлы с пробелами могут вызвать проблему. – Paddy Landau 13 November 2012 в 20:27
  • 4

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

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

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

5
ответ дан 25 May 2018 в 04:36
  • 1
    Это также полезно, когда ваш IDENTIFIER не легко превращается в подстановочный знак, или вы хотите использовать grep с более сложным регулярным выражением. – AggieBill 14 November 2012 в 16:11
  • 2
    +1 для xargs. найти почти всегда лучше и безопаснее, чем ls. найти . IDENTIFIER -exec mv {} / путь / в / dest / folder \; (непроверенный код). для текущего рабочего каталога. \; чтобы завершить выполнение команды. В зависимости от того, что вы делаете, вам может потребоваться добавить -maxdepth 1, чтобы он не возвращался в подкаталоги. – Joe 15 November 2012 в 05:33

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

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

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

2
ответ дан 25 May 2018 в 04:36
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
ответ дан 25 May 2018 в 04:36

С помощью этой команды вы можете перемещать несколько файлов.

mv SourceFilenames ~DestinationPath

1
ответ дан 25 May 2018 в 04:36

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

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

(проверено в Ubuntu 16.04)

0
ответ дан 25 May 2018 в 04:36
  • 1
    Это действительно ничего не добавляет к существующим ответам, не так ли? – dessert 1 December 2017 в 13:46
  • 2
    просто исключает необходимость указывать полный путь к директории для каждого файла – Sruli 1 December 2017 в 15:22

Другие вопросы по тегам:

Похожие вопросы: