如何同时移动和重新创建文件夹?

如何同时移动和重新创建文件夹?

我有一个名为statisticsin Ubuntu 服务器的文件夹,其中定期存储数据文件。如何在重新创建文件夹以可用于存储新文件时将statistics文件夹重命名为?backup-xxstatistics

文件夹中的文件statistics是由 PHP 创建的file_put_contents

我更喜欢重命名该文件夹,因为该文件夹中有很多文件statistics

答案1

没有办法原子地将一个目录替换为另一个目录。您可以移动旧目录然后创建一个新目录:

mv statistics backup-xx
mkdir statistics

statistics但这留下了一个不存在的小时间窗口。如果某些进程可能随时在目录中删除文件,这就是一个问题。

要有效地以原子方式替换目录,您需要使用符号链接。创建一个目录,其名称包含从开始起的时间段:

mkdir "statistics-$(date +%Y%m%d)"

(或者您想要选择目录命名约定)。创建到当前位置的具有固定名称的符号链接:

ln -s … statistics

要替换目录,首先创建一个新目录和一个新的符号链接,然后移动它以覆盖旧的符号链接。请注意,mv符号链接上的纯文本和纯文本都不会ln -s执行此操作:它们会在目标目录内创建一个条目。 GNU coreutilsln -snf也不适合,因为它在创建新符号链接之前删除了现有符号链接,从而留下了一个小时间窗口,在此期间路径不存在。您可以mv -T在新的符号链接上使用 GNU coreutils 。

new_dir="statistics-$(date +%Y%m%d)"
mkdir "$new_dir"
ln -s statistics.new
mv -Tf statistics.new statistics

答案2

mv statistics backup-xx && mkdir statistics

这会将现有statistics目录重命名为backup-xx,如果成功,它将继续创建一个新statistics目录。

对于更原子的操作,请考虑创建一个目录statistics-001(或类似的目录,可能通过001以合适的格式替换为今天的日期),以及一个名为的符号链接statistics

mkdir statistics-001
ln -s statistics-001 statistics

当您想要“旋转”此目录以便新数据进入一个干净的目录时,请首先创建该目录,然后重新创建statistics指向该目录的链接:

mkdir statistics-002
ln -sf statistics-002 statistics

mv statistics-001 backup-001

这样,任何写入该statistics目录(即该符号链接指向的目录)的程序都不会找不到它。

如果您需要在指向的目录上设置特殊权限或所有权statistics,请在(重新)创建链接之前设置这些权限或所有权。

1或者更确切地说,这样,程序运行的时间没有使用标准 Unix 工具尽可能地最小化有效的目标目录。

答案3

根本不要重命名该目录。您说您更喜欢重命名该目录,因为它有很多文件。我能想到您想要这样做的唯一原因是因为复制文件会花费太长时间。然而,移动(即重命名)只要将文件移动到同一文件系统上的某个位置,文件就会立即完成。我认为这就是您要做的事情,因为如果您要更改文件系统,无论是移动目录还是其内容,mv都将花费同样多的时间。cp

所以,只需这样做:

mkdir backup-xx && mv statistics/* backup-xx

如果您还需要获取隐藏文件,您可以执行以下操作:

mkdir backup-xx && mv statistics/* statistics/.* backup-xx

或者,如果使用bash

shopt -s dotglob; mkdir backup-xx && mv statistics/* statistics/.* backup-xx

这样,目录始终存在,但您仍然可以通过简单快速的操作移动其内容。

答案4

您可以将统计文件夹的内容移动到新创建的目录,而不是移动文件夹本身。如果移动整个文件夹,则必须运行另一个命令来更改目录权限。

mkdir -p <path>/backup-xxx
mv statistics/* <path>/backup-xxx/.

相关内容