Я долго боролся с Linux, прежде чем нашел гораздо более простое и потенциально более быстрое решение с использованием библиотеки tarfile Python.
- Используйте glob.glob для поиска нужных путей к файлам
- Создать новый архив в режиме добавления
- Добавить каждый путь к файлу в этот архив
- Закрыть архив
Вот мой пример кода:
import tarfile
import glob
from tqdm import tqdm
filepaths = glob.glob("Images/7 *.jpeg")
n = len(filepaths)
print ("{} files found.".format(n))
print ("Creating Archive...")
out = tarfile.open("Images.tar.gz", mode = "a")
for filepath in tqdm(filepaths, "Appending files to the archive..."):
try:
out.add(filepath)
except:
print ("Failed to add: {}".format(filepath))
print ("Closing the archive...")
out.close()
Это заняло в общей сложности около 12 секунд, чтобы найти 16222 пути к файлам и создать архив, однако в основном это было занято простым поиском путей к файлам. На создание tar-архива с 16000 путей к файлам ушло всего 7 секунд. С некоторой многопоточностью это могло бы быть намного быстрее.
Если вы ищете многопоточную реализацию, я ее сделал и разместил здесь:
import tarfile
import glob
from tqdm import tqdm
import threading
filepaths = glob.glob("Images/7 *.jpeg")
n = len(filepaths)
print ("{} files found.".format(n))
print ("Creating Archive...")
out = tarfile.open("Images.tar.gz", mode = "a")
def add(filepath):
try:
out.add(filepath)
except:
print ("Failed to add: {}".format(filepath))
def add_multiple(filepaths):
for filepath in filepaths:
add(filepath)
max_threads = 16
filepaths_per_thread = 16
interval = max_threads * filepaths_per_thread
for i in tqdm(range(0, n, interval), "Appending files to the archive..."):
threads = [threading.Thread(target = add_multiple, args = (filepaths[j:j + filepaths_per_thread],)) for j in range(i, min([n, i + interval]), filepaths_per_thread)]
for thread in threads:
thread.start()
for thread in threads:
thread.join()
print ("Closing the archive...")
out.close()
Конечно, вам нужно убедиться, что значения max_threads
и filepaths_per_thread
оптимизированы; для создания потоков требуется время, поэтому время может фактически увеличиваться для определенных значений. И последнее, что следует отметить: поскольку мы используем режим добавления, мы автоматически создаем новый архив с указанным именем, если он еще не существует. Однако, если один действительно уже существует, он просто добавится к уже существующему архиву, а не сбросит его или создаст новый.
person
Ryan Rudes
schedule
10.08.2020
-exec
с+
вместо;
. Если быть точным:find data/ -name 'filepattern-*2009*' -exec tar uf 2009.tar '{}' +
- person janmoesen   schedule 29.04.2010