user17273899 Asked: 2022-04-18 20:41:42 +0800 CST2022-04-18 20:41:42 +0800 CST 2022-04-18 20:41:42 +0800 CST 如何重命名两个具有相同名称的子目录中的文件? 772 我有两个子目录,s1and s2,每个子目录中都有名为file_1andfile_2的文件。如何将这些文件的名称更改为, 和, s1_file1,以便我们知道它们代表什么?s1_file2s2_file1s2_file2 linux filenames 2 个回答 Voted Seamus 2022-04-18T21:22:49+08:002022-04-18T21:22:49+08:00 您的问题省略了可能导致更一般性答案的细节。该答案通常可能没有用,但它可以按所述回答您的问题。 使用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 Best Answer Stéphane Chazelas 2022-04-18T23:23:51+08:002022-04-18T23:23:51+08:00 使用zsh(以及 GNU选项),重命名在多个(非隐藏)子目录中找到的具有相同名称(相同 ail)的(非隐藏)文件(mv不理会唯一的):-Tt 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它在olumns ( cross) 上看到值不是 () 的关联数组的reys和alues (使用反向下标)。2 Cakvcount A^1R 要仅考虑常规文件(不包括任何其他类型的文件,例如 fifos、目录、套接字、设备...),请添加.glob 限定符 ( files=($^subdirs/*(N.)))。要同时考虑隐藏文件或隐藏子目录中的文件,您可以添加Dglob 限定符,但请注意,如果添加不以点开头的前缀,则该文件将不再被隐藏。
您的问题省略了可能导致更一般性答案的细节。该答案通常可能没有用,但它可以按所述回答您的问题。
使用
mv
:使用
zsh
(以及 GNU选项),重命名在多个(非隐藏)子目录中找到的具有相同名称(相同 ail)的(非隐藏)文件(mv
不理会唯一的):-T
t
(请注意,我们不会
files=(*/*(N))
避免将符号链接中的文件考虑到目录)。请注意,在运行之后,您可能仍然会得到具有相同名称的文件,例如,如果事先有
s1/file
,s1/s2_file
和文件。s2/file
要在重命名之前获取有关哪些文件名重复的报告,您可以运行(
extendedglob
启用该选项):print
它在olumns ( cross) 上看到值不是 () 的关联数组的r
eys和alues (使用反向下标)。2
C
a
k
v
count
A
^
1
R
要仅考虑常规文件(不包括任何其他类型的文件,例如 fifos、目录、套接字、设备...),请添加
.
glob 限定符 (files=($^subdirs/*(N.))
)。要同时考虑隐藏文件或隐藏子目录中的文件,您可以添加D
glob 限定符,但请注意,如果添加不以点开头的前缀,则该文件将不再被隐藏。