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

Goo*_*bot 9 bash shell-script rename files

statistics在 Ubuntu 服务器中调用了一个文件夹,其中定期存储数据文件。如何在重新创建可用于存储新文件的文件statisticsbackup-xx时将文件夹重命名statistics为?

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

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

Gil*_*il' 12

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

mv statistics backup-xx
mkdir statistics
Run Code Online (Sandbox Code Playgroud)

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

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

mkdir "statistics-$(date +%Y%m%d)"
Run Code Online (Sandbox Code Playgroud)

(或者您想选择目录命名约定)。创建一个指向当前位置的固定名称的符号链接:

ln -s … statistics
Run Code Online (Sandbox Code Playgroud)

要替换目录,首先创建一个新目录和一个新的符号链接,然后移动它以覆盖旧的符号链接。请注意,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
Run Code Online (Sandbox Code Playgroud)


Kus*_*nda 7

mv statistics backup-xx && mkdir statistics
Run Code Online (Sandbox Code Playgroud)

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

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

mkdir statistics-001
ln -s statistics-001 statistics
Run Code Online (Sandbox Code Playgroud)

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

mkdir statistics-002
ln -sf statistics-002 statistics

mv statistics-001 backup-001
Run Code Online (Sandbox Code Playgroud)

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

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

1或者更确切地说,通过这种方式,使用标准 Unix 工具尽可能地减少程序没有有效目标目录的时间。