【问题标题】:How to split a array to several based on create date and modified date of .MTS video files如何根据 .MTS 视频文件的创建日期和修改日期将数组拆分为多个
【发布时间】:2018-05-21 00:02:59
【问题描述】:

我想根据当前 fodler 的 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

clip-5 文件夹:00016.MTS

如果当前文件夹中的每个 MTS 文件都没有 Regularity,则 只需将clip-1 制作成clip-16 并移动到每个文件夹.. 就是这样

mac 上 bash shell 的最佳脚本是什么?

================这里是我的尝试代码==============

# 首先,根据 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 ]];

【问题讨论】:

  • 请参阅“文件信息和元数据规则”上方的附加图像文件

标签: bash shell video mts


【解决方案1】:

你几乎已经在你的草图图像上得到了它。算法的想法是跟随你的红色箭头。

首先,您创建第一个目录并将第一个剪辑文件放在那里。

然后你可以从第二个到最后一个迭代,如果有一个箭头指向上一个项目,你把那个文件放到和前一个相同的目录下。否则,如果没有箭头,则创建一个新目录。

这是该计划的主要内容:

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_clipmake_clip_dirconnected_junks 函数。

最简单的是make_clip_dir

function make_clip_dir {
    mkdir "clip-$1"
}

对于connected_junks,您可以利用创建/修改的数组和一些if 条件,然后返回1 或0。

对于move_clip,您需要格式化索引以形成名称“000NN.MTS”和mv 到新目标的源文件。

【讨论】:

  • 感谢您的回答。请阅读添加的更多详细说明。让我更详细地了解如何做。
  • 问题是,00000.MTS 文件也可能是独立文件,而不是垃圾文件。所以最大独立 MTS 文件而不是垃圾文件可以存在与数组长度一样多,在这种情况下有 16 个文件夹并放置每个 MTS 文件.. 所以有些复杂
  • 这个案例在我的解决方案中处理。请阅读并告诉我,如果您有不明白的地方,我会解释。
  • 函数 make_clip_dir { mkdir "clip-$1" }
  • 函数 move_clip { mv ${indexOfcreateArrayFullFileNameWithExtension[$1]} "clip-$1" }
猜你喜欢
  • 1970-01-01
  • 2021-07-02
  • 2022-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
  • 2014-06-08
  • 1970-01-01
相关资源
最近更新 更多