Объединение большого количества файлов внутри каталога

Я успешно установил оба способа, и это не представляет проблемы, поскольку я не использую двойную загрузку; я использую другие альтернативы для запуска win на машине.

Я заметил, что размер раздела подкачки UEFI значительно меньше, чем при традиционной установке... Не знаю, почему так...

2
28.02.2019, 04:48
4 ответа

Просто:

#!/bin/bash
files_count=`ls -1./ | wc -l`
block_size=10
blocks_count=$(($files_count/$block_size))

for i in $(seq 1 1 $blocks_count); do
    files=`find. -type f -exec readlink -f {} \; | head -$block_size`
    for j in $files; do
        if [ -f $j ] && [[ "$j" != outfile* ]] ; then
            cat $j >> outfile$i
    fi
    done
done
# remainder part
for i in *; do
    if [ -f $i ] && [[ "$i" != outfile* ]] ; then
        cat $i >> outfilelast
    fi
done

Примечание:

Your files merged alphabetically and also script should be placed inside the same directory.

0
27.01.2020, 22:02

Я попытался использовать метод ниже

for ((i=1;i<=1200;i++)); do j=$(($i + 249 )); sed -n ''$i','$j'p' filename >individual_$i ;i=$j; done
0
27.01.2020, 22:02

Предполагая, что вы можете объединить их в порядке, findнаходит их:

find. -maxdepth 1 -type f -print0 |
xargs -0 -L 250 sh -c 'cat "$@" >/tmp/combined-${1##*/}' sh

Для каталога, содержащего файлы с именами от file-1до file-739(, например ), это создаст файлы в /tmpс именем combined-file-1, combined-file-251и combined-file-501, где бит после combined-— это имя первого файла в этом объединенном файле.

Он делает это, вызывая catдля объединения файлов в пакетах максимум по 250 файлов за раз в -строковом сценарии оболочки, многократно выполняемомxargs(${1##*/}в этом сценарии, удаляющем любой каталог. путь от пути к первому файлу текущего пакета ). Утилита xargsполучает имена файлов в виде строк с нулевым завершением -из find. Утилита findбудет искать в текущем каталоге (только )и выводить в нем все пути, соответствующие обычным файлам.

Затем вы должны распечатать файлы /tmp/combined-*.

Чтобы обрабатывать только файлы с определенным суффиксом, например .txt, используйте -name '*.txt'в команде findперед -print0.

Действие -print0в findи опция -0в xargsне являются стандартными -из-за общепринятой реализации.

0
27.01.2020, 22:02

Для этого можно написать простой цикл с массивом и${x:s:l}раскрытием параметров:

files=(*)
for (( i = 0; i < ${#files[@]}; i += 250 ))
do
    cat -- "${files[@]:$i:250}" > "file$i.combined"
done

Здесь мы собираем все (не -скрытые )файлы в .в массивfiles(имен файлов, отсортированных лексически ), и циклически пересчитываем от 0 до любого количества файлов. в 250с. Для каждого 250 мы расширяем имена файлов (0 -249, 250 -499 и т. д. )в качестве аргументов для catи помещаем вывод в file0.combined, file250.combinedи т. д..

Это всего лишь версия Bash традиционного цикла -в стиле C for. Поскольку вам все равно придется зацикливаться на каждом отдельном cat, нет особого смысла все усложнять.

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

3
27.01.2020, 22:02

Теги

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