使用mv将一个文件夹替换为另一个文件夹(不首先删除目标文件夹)

时间:2019-03-03 17:14:22

标签: bash shell command-line mv

我正在尝试用def bar_plot(plot_df): width = 0.35 # width of bars p_s = [] p_s.append(plt.bar(ind, plot_df.iloc[:,0], width)) for i in range(1,len(plot_df.columns)): p_s.append(plt.bar(ind, plot_df.iloc[:,i], width, bottom=np.sum(plot_df.iloc[:,:i], axis=1))) plt.ylabel('[%]') plt.title('Responses by country') x_ticks_names = tuple([item for item in plot_df.index]) plt.xticks(ind, x_ticks_names) plt.yticks(np.arange(0, 1.1, 0.1)) # ticks from, to, steps plt.legend(p_s, plot_df.columns) plt.show() 来替换现有的directory,但无法用mv完成它-我相信有办法,但我还不知道。即使查阅了手册页并搜索了网络。

如果folder仅包含/path/to/,则以下命令会将directory(消失)移动到/path/to/directory

/path/to/folder

基本上是重命名,这是我尝试实现的目标。

但是,如果mv /path/to/directory /path/to/folder 已经存在,则同一命令将/path/to/folder移动到/path/to/directory

我不想使用/path/to/folder/directory命令来避免IO。

1 个答案:

答案 0 :(得分:1)

不是使用cp来实际复制每个文件中的数据,而是使用ln指针的“副本”复制到文件中。文件。

ln /path/to/directory/* /path/to/folder && rm -rf /path/to/directory

请注意,与使用cp相比,这有点原子;每个单独的文件都一步一步出现在/path/to/folder中(即/path/to/folder/foo.txt不可能被部分复制),但是仍然有一个很小的窗口,其中来自{ {1}}已链接到/path/to/directory rm -rf folder. Also, the目录is not atomic, but assuming no one is interested in / path / to / directory , that's not an issue. (Although, as files from / path / to / folder从2变为1 。不太可能有人会在意。)


您认为文件实际上只是一个由文件系统管理的匿名文件的文件系统条目。例如,考虑一个简单的例子。

are unlinked, you *can* see changes to the link counts of files under

$ mkdir d $ cd d $ echo hello > file.txt $ cp file.txt file_copy.txt $ ln file.txt file_link.txt $ ls -li total 24 12890456377 -rw-r--r-- 2 chepner staff 6 Mar 3 12:46 file.txt 12890456378 -rw-r--r-- 1 chepner staff 6 Mar 3 12:47 file_copy.txt 12890456377 -rw-r--r-- 2 chepner staff 6 Mar 3 12:46 file_link.txt 选项将每个条目的索引节点号(第一列)添加到输出;索引节点可以被认为是文件的唯一标识符。在此输出中,您可以看到-i是一个全新文件,其inode与file_copy.txt不同。 file.txt具有完全相同的索引节点,这意味着file_link.txtfile.txt只是同一事物的两个不同名称。所有者前面的数字是链接计数file_link.txtfile.txt均引用链接计数为2的文件。

使用file_link.txt时,您只是删除指向文件的链接,而不是文件本身。在链接数减少到0之前,不会删除文件。为演示起见,我们将删除rmfile.txt

file_copy.txt

如您所见,到$ rm file.txt file_copy.txt $ ls -li total 8 12890456377 -rw-r--r-- 1 chepner staff 6 Mar 3 12:46 file_link.txt 的唯一链接消失了,因此inode 12890456378不再出现在输出中。 (是否真的丢失了数据是文件系统的实现。)file_copy仍然引用与以前相同的文件,但是现在链接数为1,因为file_link.txt已被删除。

到文件的链接不必出现在同一目录中;它们可以出现在同一文件系统上的任何目录中,这是使用此技巧的唯一警告。 ({IRC},file.txt会给您一个错误,如果您尝试创建另一个文件系统上文件的链接。)