Как разделить массив на несколько, основываясь на дате создания и дате модификации видеофайлов .MTS - PullRequest
0 голосов
/ 19 мая 2018

Я хочу сделать автоматическое создание папки на основе регулярности видеофайлов MTS текущего мошенника.

Я мог бы получить некоторую нужную информацию, объявив -a CreateArray10digits = $ (stat -f "% B" * | cut-c1-10) объявить -a ModifiedArray10digits = $ (stat -f "% m" * | cut -c1-10)

файл с ошибками имеет разность 0 с или 1 с.

так что, наконец, обрежьте-1 папка: 00000.MTS 00001.MTS 00002.MTS 00003.MTS 00004.MTS 00005.MTS 00006.MTS 00007.MTS 00008.MTS 00009.MTS 00010.MTS 00011.MTS

папка clip-2: 00012.MTS

папка clip-3: 00013.MTS 00014.MTS

папка clip-4: 00015.MTS

клип-5: 00016.MTS

если в каждом файле MTS в текущей папке нет регулярности, просто сделайте клип-1 в клип-16 и перейдите в каждую папку ... вот и все

, что будет лучшим сценарием для bashоболочка на маке?

================ здесь мой пробный код ==============

# сначала получитесписок файлов в виде массива на основе времени создания даты (в секундах) для текущего каталога для файлов MTS

declare -a  CreateArray10digits=$(stat -f "%B" *  | cut -c1-10)

# создать новый массив для CreateArray10digits

indexOfcreateArray10digits=($CreateArray10digits)

# секунд, получить список файлов в виде массива на основе времени изменения даты для текущего каталога для файлов .MTS

declare -a  ModifiedArray10digits=$(stat -f "%m" * | cut -c1-10)

# создать новый массив для ModifiedArray10digits

indexOfmodifiedArray10digits=($ModifiedArray10digits)

# и получить длину массива для CreateArray10digits

indexOfcreateArray10digitsLenth=${#indexOfcreateArray10digits[*]}

indexOfmodifiedArray10digitsLenth = $ {# indexOfmodifiedArray10digits [*]}

# создать новый массив для списка имен файлов текущего каталога

declare -a  ArrayFullFileNameWithExtension=$(stat -f "%N" *)
indexOfModifiedArrayFullFileNameWithExtension=($ArrayFullFileNameWithExtension)

declare -a  ArrayFullFileNameWithoutExtension=$(stat -f "%N" * | cut -c1-5 )
indexOfModifiedArrayFullFileNameWithoutExtension=($ArrayFullFileNameWithoutExtension)

наконец, я сделал несколько массивов, и эти массивы, наконец, имеют одинаковую длину

мой код ниже

CNT=$((${#indexOfcreateArray10digits[*]}-1)) # 17-1 = 16
last_file_index=$CNT
current_dir=1
make_clip_dir $current_dir
move_clip 0 $current_dir  # what mean 0 ?  00000.MTS ? 


# when not junked then will be make new folder by for - loop
function make_clip_dir {
    mkdir "clip-$1"
}

# is this move_clip function right ? 
function move_clip {
   mv ${indexOfModifiedArrayFullFileNameWithExtension[$1]} "./clip-$2"
}

# please check below code is right or not .. very i am confused :-) 
    function connected_junks {
    if [[ $((${indexOfcreateArray10digits[$2]} - ${indexOfmodifiedArray10digits[$1]})) -eq 0 ]];
    then

        #echo "$variable1"
        #echo "$variable2"
        echo " true !!"

    elif [[ $((${indexOfcreateArray10digits[$2]} - ${indexOfmodifiedArray10digits[$1]})) -eq 1 ]];
    then

        echo " true !!"


    else
        echo " false!!!!!!!!!!!!!!!!!!!!! "

    fi
}
echo "difference:"$((${indexOfcreateArray10digits[14]} - ${indexOfmodifiedArray10digits[13]}))
connected_junks  14 13
echo "1:"${indexOfcreateArray10digits[14]}
echo "0:"${indexOfmodifiedArray10digits[13]}
=============== results 
difference:1
 false!!!!!!!!!!!!!!!!!!!!!  # i have no idea why this is false 
1:1524058477
0:1524058395
============================================================






# for loop statement 
for i in seq 1 $last_file_index
do
    if [[ ! connected_junks $((i-1)) $i ]]; 
    then
        current_dir=$((current_dir+1))
        make_clip_dir $current_dir
    fi
    move_clip $i $current_dir 
done

# but won't works 
# only clip-1 folder was created and 00000.MTS moved into this folder 
# 
########################### ошибка результатов
/twoArrayCompare.sh: line 170: conditional binary operator expected
/twoArrayCompare.sh: line 170: syntax error near `$((i-1))'
/twoArrayCompare.sh: line 170: `    if [[ connected_junks $((i-1)) $i ]];

1 Ответ

0 голосов
/ 19 мая 2018

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

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

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

Вот основная идея этой программы:

last_file_index=16

current_dir=1
make_clip_dir $current_dir
move_clip 0 $current_dir

for i in $(seq 1 $last_file_index)
do
    if ! connected_junks $((i-1)) $i
    then
        current_dir=$((current_dir+1))
        make_clip_dir $current_dir
    fi
    move_clip $i $current_dir       
done

Вам необходимо добавить move_clip, make_clip_dir и connected_junks выполняет следующие функции:

Простейшим является make_clip_dir:

function make_clip_dir {
    mkdir "clip-$1"
}

Для connected_junks вы можете использовать свои созданные / измененные массивы и некоторые условия if, а затем вернуть 1или 0.

Для move_clip необходимо отформатировать индекс, чтобы сформировать имя «000NN.MTS» и mv исходный файл для нового места назначения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...