如何重命名两个子目录中同名的文件?

如何重命名两个子目录中同名的文件?

我有两个子目录s1s2,每个子目录中都有名为file_1和 的文件。file_2如何将这些文件的名称更改为,例如,,,s1_file1s1_file2,,s2_file1以便s2_file2我们知道它们代表什么?

答案1

您的问题省略了可能导致更笼统答案的细节。这个答案可能不是一般有用,但它回答了你的问题就像声明的那样

使用mv

$ mkdir s1 s2
$ touch s1/file_1 s1/file_2 s2/file_1 s2/file_2
$ mv s1/file_1 s1/s1_file_1
$ mv s1/file_2 s1/s1_file_2
$ mv s2/file_1 s2/s2_file_1
$ mv s2/file_2 s2/s2_file_2
$ ls -l s1 s2
s1:
total 0
-rw-r--r-- 1 pi pi 0 Apr 18 00:14 s1_file_1
-rw-r--r-- 1 pi pi 0 Apr 18 00:14 s1_file_2

s2:
total 0
-rw-r--r-- 1 pi pi 0 Apr 18 00:14 s2_file_1
-rw-r--r-- 1 pi pi 0 Apr 18 00:14 s2_file_2

答案2

使用zsh(以及 GNUmv选项),重命名在多个-T(非隐藏)子目录中以相同名称(相同)找到的(非隐藏)文件(保留唯一的文件):t

typeset -A count
subdirs=(*(N/))
files=($^subdirs/*(N))
for f ($files) (( ++count[\$f:t] ))
for f ($files) if (( count[\$f:t] > 1 )) mv -Ti -- $f $f:h/${f:h}_$f:t

(请注意,我们不会files=(*/*(N))避免考虑目录符号链接中的文件)。

请注意,运行后,您可能仍然会得到具有相同名称的文件,例如,如果之前有s1/file,s1/s2_files2/file文件。

要在重命名之前获取哪些文件名重复的报告,您可以运行(extendedglob启用该选项):

print -raC2 -- ${(kv)count[(R)^1]}

它在列(交叉)上print显示了值不是 ( )的关联数组的属性和属性(使用反向下标)。r2 Cakvcount A^1R

仅考虑常规的文件(排除任何其他类型的文件,例如 fifo、目录、套接字、设备...),添加.glob 限定符 ( files=($^subdirs/*(N.)))。要同时考虑隐藏文件或隐藏子目录中的文件,您可以添加Dglob 限定符,但请注意,如果添加不以点开头的前缀,则该文件将不再隐藏。

相关内容