我正在尝试从不断被写入(文件和文件夹)的源文件夹中移动文件。一旦不再写入文件,就不会再进行读写操作。我想将未使用的文件移动到另一个文件夹,但保留目录结构。我最终将要将此添加到连续循环中,或使其定期运行以“清除”源文件夹。
这是我之前和之后的例子:
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
我不太了解命令行,所以我不确定如何将这两个概念放在一起。
感谢您的帮助。
答案 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/
工作
isUsed
函数用于检查当前是否正在使用文件。
返回值:1
-正在使用文件,0
-未使用文件
当前,文件许可权用于查找文件是否正在使用中。如果文件具有写权限,则将其视为已使用。您可以将其更改为用于评估是否使用文件的任何其他逻辑,例如问题中提到的lsof
。
find "$parent_dir$src_dir"
将列出给定路径中的所有文件和目录。使用while循环一次将find
命令的输出读入$line
中。
示例:假设$line
等于Parent/Source/DirA/File2NotInUse.abc
我们调用isUsed
函数来检查文件是否正在使用。函数调用的返回值存储在$retval
如果$retval
等于"0"
,则表示该文件未被使用,我们必须将其移动到目标目录。
首先,我们将使用dirname
生成要移动的文件的路径。它将返回文件的相对路径。
$filepath
等于Parent/Source/DirA
然后,我们从filepath
中删除父目录名称。
因此,$filepath
成为Source/DirA
然后我们从filepath
中删除源目录名称。
因此,$filepath
现在等于DirA
。得到的filepath
将是文件相对于源目录的路径。
在Destination/
中使用给定的filepath
创建目录。 mkdir -p
将创建filepath
中给定的所有中间目录。
mkdir -p Parent/Destination/DirA
最后一步是将实际文件从其Source
路径移动到新创建的Destination
路径。
mv Parent/Source/DirA/File2NotInUse.abc Parent/Destination/DirA/