У меня есть каталог с множеством файлов, например, 50000 PDF-файлов и других файлов на сервере. Мне нужно переместить конкретные в другой каталог. Я могу сгенерировать список файлов, которые должны быть перемещены в CSV или любом другом текстовом формате.
Что мне нужно сделать, это запустить скрипт bash и переместить или скопировать файлы, перечисленные в текстовом файле, в другой каталог.
Есть ли простой способ сделать это? Любые предложения или ресурсы будут с благодарностью.
Ответы:
В rsync есть несколько опций, которые могут принимать список файлов для обработки (
--files-from
,--include-from
и т. д.).Например, это поможет:
источник
rsync -a /source/directory --files-from=/full/path/to/listfile /destination/directory
Чтобы избежать бесполезного использования
cat
(и если вы не используетеrsync
):Это будет обрабатывать любое допустимое имя файла, если оно не содержит новую строку, если файлы перечислены по одному в строке.
источник
mv
приведет к сворачиванию всех их в один и тот же каталог назначения.rsync
Подход в общепринятом ответ не страдает от этого ограничения.предполагая bash, плюс
listoffiles
содержащий один файл на строку. Мое единственное возражение против маршрута rsync состоит в том, что OP запрашивает способ перемещения файлов, а не их копирования. В rsync больше флагов, чем в королевской свадьбе, поэтому я уверен, что это можно изменить, но иногда проще - лучше!источник
while read -r file; do mv "$file" /path/of/destination ; done < listoffiles
Это зависит от формата текстового файла, который у вас есть. Например, если у вас есть список файлов, записанных так, что каждый файл находится в новой строке. Вы можете использовать XARGS, как:
Также вы можете использовать
find
команду с-exec
опцией. копировать / перемещать файлы.источник
Rsync имеет дополнительное преимущество по сравнению с командами
cp
or,mv
поскольку он автоматически создает папки, если они не существуют.источник
/path/to/source
нужно, когда он берет пути из списка файлов?Я думаю, что ответ rsync лучше, но только для другого варианта:
источник
Я случайно скопировал все содержимое каталога в каталог назначения вместо перемещения полного каталога. Это привело к тому, что каталог-источник был захламлен, а не каталог-источник был добавлен в каталог.
Чтобы это исправить, я сделал следующее:
ls -rt /path/to/cluttered/destination/directory/ > /opt/dircheck/filestomove
Приведенная выше команда создает файл filestomove, который будет списком всего содержимого каталога назначения, отсортированным по времени в обратном порядке, что означает самый старый или самый новый.Затем я создал подкаталог теперь загроможденного целевого каталога, в который нужно переместить материал.
mkdir /path/to/cluttered/destination/directory/newsubdirectory
Затем я повторил список каталогов, за исключением вывода на экран и отображения более подробной информации.
ls -lrht /path/to/cluttered/destination/directory/
В этой строке указывается каталог, отсортированный по возрастанию по дате (обратная сортировка по времени), и отображается дополнительная информация, включая метку даты / времени для каждого файла в теперь загроможденном каталоге назначения. Я обращаюсь к этому, начиная сверху, чтобы показать, какие каталоги и файлы я хочу сохранить там, где они были. В метке даты / времени файлов, где начинаются все новые файлы, будет пробел, которого там быть не должно.Затем я отредактировал файл filestomove, созданный на первом шаге выше (который отсортирован по дате), и удалил несколько из списка, которые были там ранее, и я хочу остаться из исходного каталога.
vim /opt/dircheck/filestomove
Удалите сверху все файлы, которые вы не хотите перемещать.Затем я использовал команду, указанную ранее в этом посте, чтобы переместить файлы из моего списка в новый каталог, который я создал.
sudo xargs -a /opt/dircheck/filestomove mv -t /path/to/cluttered/destination/directory/newsubdirectory
Это переместило все файлы за доли секунды. (Примечание: вам может не понадобиться sudo в начале, это вопрос прав доступа к файлам).
Теперь мой исходный каталог назначения хорош и чист и содержит новый каталог со всеми файлами и каталогами, которые его загромождали.
источник
Если (и только если), у вас нет никаких неприятных символов в именах файлов (пробелы, символы новой строки, которые могли бы запутать xargs в том, как разбить вещи на отдельные аргументы), и вы генерируете список файлов, разделенных символами новой строки (один файл на строку), вы могли бы сделать что-то вроде.
(В общем, смотрите man xargs , это круто )
Если ваш конкретный mv не имеет опции -t, вы также можете сделать некоторые хитрости, такие как
Примечание. Ни один из них не будет работать должным образом, если в нем есть имена файлов с символами новой строки.
источник
cp
,mv
И тому подобное не имеют-t
опцию BSD «s, а второй пример с субоболочке не работа для меня (/path/to/move
прилагается в качестве последнего файла)(cat filenames.txt; echo; echo /path/to/move/files/to) | xargs mv
Попробуйте что-то вроде:
источник
while read line; do mv $line /images; done < list.txt
как одна командаСледующее сработало для меня, когда мне нужно было скопировать все файлы PNG с определенного пути (и всех подкаталогов) в новое место, сохранив при этом структуру каталогов:
Поскольку RSYNC сначала создает зеркало структуры каталогов, а затем синхронизирует файлы, вы можете получить лишние папки, которые будут пусты. Я использовал флаг --prune-empty-dirs, чтобы удалить эти пустые каталоги.
Я не имею никакой принадлежности, но считал правильным отдать должное источнику, который вдохновил это решение: http://techblog.zabuchy.net/2011/transfer-only-selected-file-types-with-rsync/
источник