如何复制文件夹中除正在写入的文件之外的所有文件?

如何复制文件夹中除正在写入的文件之外的所有文件?

我将多个文件下载到一个文件夹中downloading通过以下方式将多个文件下载到一个文件夹中HTTPie。 bash 脚本旨在处理下载的文件,我尝试将下载的文件复制到另一个文件夹,如下所示

find /folder/downloading -type f -exec mv '{}' /folder/downloaded \;

但这也会复制尚未完成的文件。我尝试通过添加-mmin +5命令来限制对旧文件的传输。离开正在写入的文件并仅传输下载的文件的有效命令是什么?

答案1

效率不是很高,但你可以这样做:

find /folder/downloading -type f -exec sh -c '
  for file do
    lsof -F a "$file" | grep -q w || mv "$file" /folder/downloaded
  done' sh {} +

即在关闭之前检查该文件是否未在文件的i中以w仪式a访问模式列出。lsofmv

通常在基于 Linux 的操作系统上发现的psmisc实现具有一个功能(检查打开用于写入的文件),但不幸的是它只能用于杀死相应的进程。但是,似乎您仍然可以通过使用不执行任何操作的伪信号 0 来使用它:fuser-w-k

find /folder/downloading -type f -exec sh -c '
  for file do
    fuser -s -w -k -0 "$file"  || mv "$file" /folder/downloaded
  done' sh {} +

如果您想查看哪些进程正在阻止移动,请删除-s(甚至用 替换)。-v

请注意,如果您没有以超级用户身份运行这些命令,您将只能获得有关进程的信息。如果下载文件的进程以其他用户身份运行,则它们将不会被检测到。

另请注意,除非您将文件移动到不同的文件系统,否则移动文件不会阻止当前正在写入文件的任何进程完成写入。

但是,根据他们之后的设计目的,如果在完成写入后文件不再存在,他们可能会感到困惑(例如,如果他们想在下载文件后更改文件的某些属性并这样做)不是通过文件描述符(如chmod()vs fchmod(),或utimes()无法通过文件描述符完成))。

相关内容