AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 792740
Accepted
user447274
user447274
Asked: 2025-03-20 12:55:28 +0800 CST2025-03-20 12:55:28 +0800 CST 2025-03-20 12:55:28 +0800 CST

移动/标记文件以及相关部分

  • 772

有一个文件夹,里面有很多文件:

112.mkv
123.md5
123.mkv
221.mkv
467.mkv
aa1.mkv
abc.md5
abc.mkv
bbc.mkv
dde.md5
dde.mkv
ggh.mkv
....
xxy.md5
xxy.mkv
xxz.mkv

如何将.md5文件和相关.mkv文件移动到新目录(使用 Bash)?

123.md5
123.mkv

abc.md5
abc.mkv

dde.md5
dde.mkv

xxy.md5
xxy.mkv

我想将这些文件移动到一个新目录中,例如mkvandmd5/。

或者,Midnight Commander 中是否有任何提示来标记这些文件.md5和相关.mkv文件?

bash
  • 5 5 个回答
  • 125 Views

5 个回答

  • Voted
  1. Best Answer
    Cyrus
    2025-03-21T05:08:02+08:002025-03-21T05:08:02+08:00

    及其bash参数扩展:

    for i in *.mkv; do
      [[ -e "${i%.*}.md5" ]] && echo mv -v -- "$i" "${i%.*}.md5" mkvandmd5;
    done
    

    输出:

    mv -v 123.mkv 123.md5 mkvandmd5
    mv -v abc.mkv abc.md5 mkvandmd5
    mv -v dde.mkv dde.md5 mkvandmd5
    mv -v xxy.mkv xxy.md5 mkvandmd5
    

    echo如果输出看起来没问题则删除。

    • 3
  2. Stéphane Chazelas
    2025-03-20T21:38:40+08:002025-03-20T21:38:40+08:00

    如果您的意思是想要移动*.mkv具有相应.md5文件(以及该.md5文件)的文件,那么zsh您可以执行以下操作:

    mv -- *.mkv(e['md5=$REPLY:r.md5; [ -e $md5 ] && reply=($REPLY $md5)']) mkvandmd5/
    

    .mkv如果每个总有一个.md5,则可以简化为:

    mv -- *.md5(e['reply=($REPLY:r.mkv $REPLY)']) mkvandmd5/
    

    或者:

    (){mv -- $@ $^@:r.mkv mkvandmd5/} *.md5
    

    使用(如果您在 yash 中将with和withbash替换,则在 zsh 或 yash中也可以使用),您可以执行以下操作:shopt -s nullglobset -o nullglob${#files[@]}${files[#]}

    (
      shopt -s nullglob
      files=()
      for file in *.mkv; do
        md5=${file%.*}.md5
        if [ -e "$md5" ]; then
          files+=( "$file" "$md5" )
        fi
      done
      if [ "${#files[@]}" -gt 0 ]; then
        exec mv -- "${files[@]}" mkvandmd5/
      else
        echo>&2 No match; exit 1
      fi
    )
    

    .mkv或者如果每个都总有一个.md5:

    (
      shopt -s failglob; shopt -u nullglob
      set -- *.md5 &&
        mv -- "$@" "${@/%.md5/.mkv}" mkvandmd5/
    )
    
    • 2
  3. Timur Shtatland
    2025-03-21T02:38:37+08:002025-03-21T02:38:37+08:00

    使用这个单行代码,它利用find和xargs:

    find . -maxdepth 1 -mindepth 1 -name '*.mkv' | xargs -I{} basename {} .mkv | xargs -I{} mv -- {}.mkv {}.md5 dest_dir/
    

    细节:

    find . -maxdepth 1 -mindepth 1 -name '*.mkv':在当前目录中查找所有.mkv文件。
    xargs -I{} basename {} .mkv:从文件名中剥离.mkv扩展名(和目录名,但这与此无关),仅保留基本名称。 :将具有此基本名称和扩展名
    xargs -I{} mv {}.mkv {}.md5 dest_dir/的文件移动到目录。.mkv.md5dest_dir/

    • 2
  4. Jetchisel
    2025-03-21T07:32:21+08:002025-03-21T07:32:21+08:00

    您可以尝试使用数组和一些参数扩展来使用完整的脚本

    #!/usr/bin/env bash
    
    pairs=()
    destination=MkvAndMd5/
    
    ##: See https://mywiki.wooledge.org/BashFAQ/004
    shopt -s nullglob
    hash=(*.md5)
    movie=(*.mkv)
    shopt -u nullglob
    
    (( ${#hash[*]} && ${#movie[*]} )) || {
      printf 'Missing file(s): no .mkv files, .md5 files, or both.\n' >&2
      exit 1
    }
    
    ##: Loop through the files ending in .mkv and .md5
    for i in "${!hash[@]}"; do
      if [[ "${movie[i]%.*}" == "${hash[i]%.*}" ]]; then  ##: If the file name matches.
        pairs+=("${movie[i]}" "${hash[i]}")               ##: Save them in an array named pairs.
      fi
    done
    
    ##: If there are no match found (array is empty), Print a message and exit.
    (( ${#pairs[*]} )) || {
      printf 'File names for .mkv and .md5 does not match!\n' >&2
      exit 1
    }
    
    echo mkdir -pv "$destination" || exit           ##: Create the "$destination" directory.
    echo mv -v -- "${pairs[@]}" "$destination" || exit ##: Move the file names that matches at the destination directory
    

    • 删除echoif/when 对输出满意的情况。

    • 看

      • http://mywiki.wooledge.org/BashSheet#Arrays
      • http://mywiki.wooledge.org/BashFAQ/005
      • http://mywiki.wooledge.org/BashFAQ/073
    • 0
  5. userene
    2025-03-22T05:23:05+08:002025-03-22T05:23:05+08:00

    解决这个问题的关键是生成一个排除唯一基本名称条目的文件列表。

    下面是一个带有命令及其输出的方法——后面是解释:

    $ grep -Ff <(cut -d. -f1 input.txt | sort | uniq -D) input.txt 
    123.md5
    123.mkv
    abc.md5
    abc.mkv
    dde.md5
    dde.mkv
    xxy.md5
    xxy.mkv
    

    解释:

    • 按字段剪切(以 . 作为分隔符)以去除扩展名
    • 对结果列表进行排序
    • 使用 uniq -D 命令仅输出重复的条目
    • 最后将此列表作为模式文件,用于对原始输入进行(固定字符串)grep 操作

    将这些文件移动到目标目录是一项简单的任务。例如:

    mv *.md5 *.mkv mkvandmd5/
    

    或者,您可以将输出传送到 while 命令并在生成文件时移动它们,例如:

    while read -r file; do
        mv "$file" mkvandmd5/
    done
    
    • 0

相关问题

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve