【问题标题】:Linux: remove duplicate strings from for and cutLinux:从 for 和 cut 中删除重复的字符串
【发布时间】:2019-01-02 19:02:15
【问题描述】:

所以我有一个看起来像这样的文件结构:

  • 视频
    • abc.avi
    • party_2014.h264
    • test.avi
    • xxx.mkv

我需要为每个扩展创建一个目录并将相应的文件移到那里,这样它看起来像这样

  • 视频
    • 视频-avi
      • abc.avi
      • test.avi
    • 视频-h264
      • party_2014.h264
    • 视频-mkv
      • xxx.mkv

到目前为止,我有这个代码:

for i in $(find video -name "*.*" -print)
    do cut -d'.' -f2 <<< "$i" | uniq -c;
done

这将返回重复的 avi,因此 uniq 似乎无法正常工作,如何正确删除重复项?

【问题讨论】:

    标签: linux bash for-loop find


    【解决方案1】:

    这个简单的脚本可能对你有用:

    #!/usr/bin/env bash    
    
    shopt -s nullglob
    
    dir=video
    for file in "$dir"/*.*; do
        out=$dir/video-${file##*.}
    
        [[ -d $out ]] || mkdir -- "$out" || continue
        mv -- "$file" "$out"
    done
    

    您还可以指定扩展名:in "$dir"/*.{avi,mkv,h264}

    【讨论】:

    • 确保您了解 参数扩展 的工作原理(它们对于字符串解析非常方便)请参阅 参数扩展 下的man bash。跨度>
    • 调整 -- 防止空格 out="$dir/video-${file##*.}" (你在其他地方覆盖它)
    • @DavidC.Rankin 在变量赋值中不需要。不过后面我会在参数扩展上加个OP的解释,好主意:)
    • 哦,完全正确 - man bashPARAMETERS 下的name=[value] 后面的段落。 (我仍然会引用它,因为我怀疑 99% 的人都知道它何时适用的更精细的点——对于更安全的路线:) 有很多话要说
    • @DavidC.Rankin 的确,这是一种习惯的力量 :) 就像不在 [[...]] 中引用 $out
    猜你喜欢
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 2013-11-22
    • 2018-02-20
    相关资源
    最近更新 更多