我有两个子目录s1
和s2
,每个子目录中都有名为file_1
和 的文件。file_2
如何将这些文件的名称更改为,例如,,,s1_file1
和s1_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_file
和s2/file
文件。
要在重命名之前获取哪些文件名重复的报告,您可以运行(extendedglob
启用该选项):
print -raC2 -- ${(kv)count[(R)^1]}
它在列(交叉)上print
显示了值不是 ( )的关联数组的属性和属性(使用反向下标)。r
2
C
a
k
v
count
A
^
1
R
仅考虑常规的文件(排除任何其他类型的文件,例如 fifo、目录、套接字、设备...),添加.
glob 限定符 ( files=($^subdirs/*(N.))
)。要同时考虑隐藏文件或隐藏子目录中的文件,您可以添加D
glob 限定符,但请注意,如果添加不以点开头的前缀,则该文件将不再隐藏。