Linux
如何重命名兩個具有相同名稱的子目錄中的文件?
我有兩個子目錄,
s1
ands2
,每個子目錄中都有名為file_1
andfile_2
的文件。如何將這些文件的名稱更改為, 和,s1_file1
,以便我們知道它們代表什麼?s1_file2``s2_file1``s2_file2
使用
zsh
(以及 GNU選項),重命名在多個(非隱藏)子目錄中找到的具有相同名稱(相同 ail)的(非隱藏)文件(mv
不理會唯一的):-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]}
r
eys和alues (使用反向下標)。2
C``a``k``v``count
A``^``1``R
要僅考慮正常文件(不包括任何其他類型的文件,例如 fifo、目錄、套接字、設備…),請添加
.
glob 限定符 (files=($^subdirs/*(N.))
)。要同時考慮隱藏文件或隱藏子目錄中的文件,您可以添加D
glob 限定符,但請注意,如果添加不以點開頭的前綴,則該文件將不再被隱藏。
您的問題省略了可能導致更一般性答案的細節。該答案通常可能沒有用,但它可以按所述回答您的問題。
使用
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