두 개의 하위 디렉터리가 있고 s1
각 s2
하위 디렉터리에는 and라는 파일이 있습니다 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
(및 GNU 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]}
열(교차점)에서 print
값이 ()가 아닌 연관 배열(역첨자 사용)의 속성 및 속성을 표시합니다 .r
2
C
a
k
v
count
A
^
1
R
단지 고려정기적인파일(fifo, 디렉토리, 소켓, 장치 등 다른 유형의 파일 제외)에 .
glob 한정자( files=($^subdirs/*(N.))
)를 추가합니다. 숨겨진 파일이나 숨겨진 하위 디렉터리의 파일도 고려하려면 D
glob 한정자를 추가할 수 있지만 점으로 시작하지 않는 접두사를 추가하면 파일이 더 이상 숨겨지지 않습니다.