【问题标题】:Find, move, and create empty file in place of file that was moved查找、移动和创建空文件来代替已移动的文件
【发布时间】:2018-03-11 03:40:51
【问题描述】:

我正在寻找一个 crontab,它将搜索目录和所有子目录并找到所有扩展名为 *.mkv 的文件,然后将它们移动到不同的目录并创建一个具有相同名称和扩展名的空文件来代替原始文件。

所以它看起来像这样:

  1. 在/home/user/directoryA/~的子目录中找到*.mkv
  2. 将 *.mkv 移动到 /home/user/directoryB/
  3. 创建与原始文件名相同的空 *.mkv 文件,以代替 /home/user/directoryA/~中的文件

最好的方法是什么?

【问题讨论】:

  • Stack Overflow 不是代码编写服务。请出示您的代码。由于 Stack Overflow 向您隐藏了关闭原因:寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误以及在问题本身。没有明确问题陈述的问题对其他读者没有用处。请参阅:How to create a Minimal, Complete, and Verifiable example

标签: bash shell


【解决方案1】:

如果您认识到在形成新目录名称时,旧的基本目录将只是新目录名称中的一个 子字符串,那么这个过程并不太难。 Bash 提供了一个带有子字符串替换的参数扩展,它是为这个过程量身定做的。

本质上,您 find 源目录下的每个文件都带有 *.mkv 扩展名,您使用 带有子字符串替换的参数扩展 来形成包含目标目录的新完整文件名,(例如nffn="${ffn/$srcdir/$destdir}",其中ffnfull-filename 的缩写,nffnnew full-filename 的缩写)

使用包含更新路径的新完整文件名,只需在移动文件之前确保目标目录存在即可。 mkdir -p 在这里是完美的,因为它将创建完整路径,并且如果目录已经存在则不会抱怨。您只需使用 带有子字符串删除的参数扩展 将新目录与新的完整文件名隔离开以传递给mkdir -p,最后,检查mkdir -p 是否成功或处理错误,例如

## create new directory, handle error if create fails
mkdir -p "${nffn%/*}" || { 
    echo "error: creating '${nffn%/*}'" >&2
    exit 1
}

将所有部分放在一起,您可以使用类似于以下的简短脚本执行您正在尝试的操作。

#!/bin/bash

## source and destination directories, file pattern
#  (note: to change destdir, two arguments required
#         to change patrn, three arguments required)
srcdir="${1:-/home/david/dev/src-c/tmp/debug/AAA}"
destdir="${2:-/home/david/dev/src-c/tmp/debug/BBB}"
patrn="${3:-*.mkv}"

while read -r ffn; do               ## loop over each full-filename
    nffn="${ffn/$srcdir/$destdir}"  ## form new full-filename
    ## create new directory, handle error if create fails
    mkdir -p "${nffn%/*}" || { 
        echo "error: creating '${nffn%/*}'" >&2
        exit 1
    }
    mv "$ffn" "$nffn"               ## move full-filename to new full-filename
    touch "$ffn"                    ## touch full-filename for zero original
done < <(find "$srcdir" -name "$patrn")

(注意:您可以将目录和文件模式作为位置参数传递,但请注意,如果您传递超过1个,则必须传递每个必需的参数(或者您可以实现getotp))

初始目录 AAA 和 BBB

$ tree AAA
AAA
├── a.mkv
├── b.mkv
├── dir1
│   ├── a.mkv
│   └── b.mkv
├── dir2
│   ├── a.mkv
│   └── b.mkv
├── dir3
│   ├── a.mkv
│   └── b.mkv
└── dira
    ├── a.mkv
    └── b.mkv

$ tree BBB
BBB [error opening dir]

最终目录 AAA 和 BBB

$ bash mvemptydir.sh

$ tree AAA
AAA
├── a.mkv
├── b.mkv
├── dir1
│   ├── a.mkv
│   └── b.mkv
├── dir2
│   ├── a.mkv
│   └── b.mkv
├── dir3
│   ├── a.mkv
│   └── b.mkv
└── dira
    ├── a.mkv
    └── b.mkv

$ tree BBB
BBB
├── a.mkv
├── b.mkv
├── dir1
│   ├── a.mkv
│   └── b.mkv
├── dir2
│   ├── a.mkv
│   └── b.mkv
├── dir3
│   ├── a.mkv
│   └── b.mkv
└── dira
    ├── a.mkv
    └── b.mkv

查看一下,如果您还有其他问题,请告诉我。

【讨论】:

    【解决方案2】:

    你可以这样写一个脚本:

    #!/bin/bash
    cd /[ADDRESS]
    find . -name *.mkv > /tmp/find_result.txt
    mv `cut -f1 /tmp/find_result.txt` /backup/
    touch `cut -f1 /tmp/find_result.txt`
    

    1- 转到您要查找此文件的目录

    2- 查找所有 .mkv 文件并将结果发送到本示例中的 /tmp/find_result.txt 等文件

    3- 将所有文件(保存在文件“/tmp/find_result.txt”中)移动到您想要的目录(如本例中的“/backup”)

    4- 最后创建同名的空文件(保存在文件“/tmp/find_result.txt”中)

    您可以将此脚本添加到 crontab。

    【讨论】:

      【解决方案3】:

      您可以对每个符合您条件的文件使用循环来执行此操作!

      for f in `find . -name *.mkv`; do
          mv $f /home/user/directoryB/
          touch $f
      done;
      

      如果您想变得花哨,可以将其放入脚本中并接受 directoryA/B 作为参数:

      for f in `find $1 -name *.mkv`; do mv $f $2; touch $f; done;
      

      并以./script.sh /home/user/directoryA/~ /home/user/directoryB/ 运行

      【讨论】:

        猜你喜欢
        • 2022-01-19
        • 2021-03-14
        • 2023-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-26
        • 1970-01-01
        相关资源
        最近更新 更多