移动未使用的文件并保留目录结构

时间:2019-03-05 05:39:58

标签: linux bash shell rsync

我正在尝试从不断被写入(文件和文件夹)的源文件夹中移动文件。一旦不再写入文件,就不会再进行读写操作。我想将未使用的文件移动到另一个文件夹,但保留目录结构。我最终将要将此添加到连续循环中,或使其定期运行以“清除”源文件夹。

这是我之前和之后的例子:

next

我发现answers正在移动不使用的文件:

1->3->4->6->8->9

我还发现answers用于移动文件并保留目录结构:

也许与<form><i className="fa fa-search serc-icon"></i> <textarea ref="searchProduct" className="plac-holder-text" defaultValue='' onChange={this.searchForExisitingProducts} placeholder="Search Product"></textarea> <i onClick={this.clearProductInput} className="fa fa-times clos-icon"></i> </form>

Before:
Parent/
├── Source/
│   ├── DirA/
│   │   ├── File1InUse.abc
│   │   ├── File2NotInUse.abc
│   │   └── File3InUse.abc
│   └── DirB/
│       ├── File4InUse.abc
│       ├── File5NotInUse.abc
│       └── File6NotInUse.abc
│
├── Destination/

After:
Parent/
├── Source/
│   ├── DirA/
│   │   ├── File1InUse.abc
│   │   └── File3InUse.abc
│   └── DirB/
│       └── File4InUse.abc
│
├── Destination/
    ├── DirA/   
    │   └── File2NotInUse.abc
    └── DirB/
        ├── File5NotInUse.abc
        └── File6NotInUse.abc

我不太了解命令行,所以我不确定如何将这两个概念放在一起。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这就是我要做的。创建了一个脚本,以便您可以从其他程序或cron作业中使用它。

#! /bin/bash

isUsed() {
    test -w "$1" && echo 1 || echo 0
}

parent_dir=$1
src_dir=$2
dst_dir=$3

while read -r line
do
    retval=$(isUsed "$line")
    if [ $retval -eq "0" ]
    then
        filepath=$(dirname $line)
        filepath=${filepath#$parent_dir}
        filepath=${filepath#$src_dir}
        mkdir -p "$parent_dir$dst_dir$filepath"
        mv "$line" "$parent_dir$dst_dir$filepath"/
    fi
done <<< $(find "$parent_dir$src_dir")

用法

./script.sh Parent/ Source/ Destination/

工作

  1. isUsed函数用于检查当前是否正在使用文件。

    返回值:1-正在使用文件,0-未使用文件

    当前,文件许可权用于查找文件是否正在使用中。如果文件具有写权限,则将其视为已使用。您可以将其更改为用于评估是否使用文件的任何其他逻辑,例如问题中提到的lsof

  2. find "$parent_dir$src_dir"将列出给定路径中的所有文件和目录。使用while循环一次将find命令的输出读入$line中。

    示例:假设$line等于Parent/Source/DirA/File2NotInUse.abc

  3. 我们调用isUsed函数来检查文件是否正在使用。函数调用的返回值存储在$retval

  4. 如果$retval等于"0",则表示该文件未被使用,我们必须将其移动到目标目录。

  5. 首先,我们将使用dirname生成要移动的文件的路径。它将返回文件的相对路径。

    $filepath等于Parent/Source/DirA

    然后,我们从filepath中删除父目录名称。

    因此,$filepath成为Source/DirA

    然后我们从filepath中删除源目录名称。

    因此,$filepath现在等于DirA。得到的filepath将是文件相对于源目录的路径。

  6. Destination/中使用给定的filepath创建目录。 mkdir -p将创建filepath中给定的所有中间目录。

    mkdir -p Parent/Destination/DirA

  7. 最后一步是将实际文件从其Source路径移动到新创建的Destination路径。

    mv Parent/Source/DirA/File2NotInUse.abc Parent/Destination/DirA/