Bash 查找、移动和创建空文件以代替已移动的文件

Bash 查找、移动和创建空文件以代替已移动的文件,bash,shell,Bash,Shell,我正在寻找一个crontab,它将搜索一个目录和所有子目录,找到扩展名为*.mkv的所有文件,然后将它们移动到另一个目录,并创建一个具有相同名称和扩展名的空文件来代替原始文件 所以看起来是这样的: 在/home/user/directoryA的子目录中查找*.mkv/~ 将*.mkv移动到/home/user/directoryB/ 在/home/user/directoryA中创建文件名与原始文件名相同的空*.mkv/~ 完成此任务的最佳方法是什么?您可以编写如下脚本: #!/bin/bash

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

所以看起来是这样的:

  • 在/home/user/directoryA的子目录中查找*.mkv/~
  • 将*.mkv移动到/home/user/directoryB/
  • 在/home/user/directoryA中创建文件名与原始文件名相同的空*.mkv/~

  • 完成此任务的最佳方法是什么?

    您可以编写如下脚本:

    #!/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。

    您可以编写如下脚本:

    #!/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。

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

    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/

    的形式运行。您可以使用循环对符合条件的每个文件执行此操作

    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/
    运行。如果您认识到在形成新目录名时,旧的基本目录将只是新目录名中的一个子字符串,那么这个过程就不会太困难了。Bash提供了一个带有子字符串替换的参数扩展,该子字符串替换是为此过程定制的

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

    新的完整文件名包含更新的路径,移动文件之前只需确保目标目录存在即可
    mkdir-p
    在这里非常完美,因为它将创建完整路径,并且不会抱怨目录是否已经存在。您只需使用参数expansin和子字符串删除来将新目录与要传递给
    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")
    
    最终目录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]
    
    $ 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
    

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

    如果您意识到在形成新目录名时,旧的基本目录将只是新目录名中的一个子字符串,那么这个过程就不会太困难了。Bash提供了一个带有子字符串替换的参数扩展,该子字符串替换是为此过程定制的

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

    新的完整文件名包含更新的路径,移动文件之前只需确保目标目录存在即可
    mkdir-p
    在这里非常完美,因为它将创建完整路径,并且不会抱怨目录是否已经存在。您只需使用参数expansin和子字符串删除来将新目录与要传递给
    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")
    
    最终目录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]
    
    $ 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
    

    请仔细检查,如果您还有其他问题,请告诉我。

    堆栈溢出不是一种代码编写服务。请出示你的密码。由于堆栈溢出对您隐藏了关闭原因:寻求调试帮助的问题(“为什么此代码不工作?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:。堆栈溢出不是代码写入服务。请出示你的密码。由于堆栈溢出对您隐藏了关闭原因:寻求调试帮助的问题(“为什么此代码不工作?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:。