Как я могу прозрачно кэшировать любой каталог или подключенную файловую систему для чтения и обратной записи?

Вопрос помечен тегами и , поэтому я предполагаю, что есть интерес к ответу, который использует регулярные выражения. Также вопрос указывает на то, что файл входных данных большой, поэтому я предполагаю, что производительность является важным фактором.

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

Другие ответы фактически порождают процесс cp для каждого файла. Это приводит к ненужному снижению производительности. Вместо этого мы можем использовать возможности xargs для вызова cp с таким количеством имен файлов, которое может поместиться в командной строке.

sed -rn 's/ (5[1-9]|[6-9].|1..)$//p' input.txt | tr '\n' '\0' | xargs -0 cp -t /destdir

sed использует регулярное выражение для соответствия закрытому числовому интервалу (50, 200) . Использование регулярных выражений для числовых неравенств не всегда является самым элегантным занятием, но в этом случае требуемое выражение является довольно простым.

Мы предполагаем, что имена файлов не содержат символов новой строки, но могут содержать другие бесполезные символы, такие как пробелы. xargs будет обрабатывать это правильно, если заданы \ 0 -деограниченные данные, поэтому мы используем tr для преобразования всех символов новой строки в нулевые символы.

Сказанное выше предполагает наличие GNU-версий sed и xargs . Если вместо этого у вас есть версии BSD (например, OSX), тогда команда немного отличается:

sed -En 's/ (5[1-9]|[6-9].|1..)$//p' input.txt | tr '\n' '\0' | xargs -0 -J {} cp {} /destdir

Эти команды порождают ровно одну копию sed , tr и xargs .Будет более одного порождения cp , но каждый будет копировать несколько файлов - xargs попытается заполнить каждую командную строку cp , чтобы обеспечить эффективное использование . Это должно обеспечить значительное улучшение производительности по сравнению с другими ответами, когда входные данные большие.

22
22.09.2016, 19:44
1 ответ

Это невежественный ответ, поскольку у меня нет доступа к облачному каталогу Amazon с который это проверить. Но в духе «Как это сделать» : настройте облако Amazon для обслуживания NFS , затем войдите удаленно на этот сервер NFS с помощью cachefilesd .

«Легче сказать, чем сделать ...»

1
27.01.2020, 19:43

Теги

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