두 개의 하위 디렉터리에서 동일한 이름을 가진 파일의 이름을 바꾸는 방법은 무엇입니까?

두 개의 하위 디렉터리에서 동일한 이름을 가진 파일의 이름을 바꾸는 방법은 무엇입니까?

두 개의 하위 디렉터리가 있고 s1s2하위 디렉터리에는 and라는 파일이 있습니다 file_1. file_2이러한 파일의 이름을 예를 들어 , s1_file1및 로 변경하여 파일이 무엇을 나타내는지 알 수 있도록 s1_file2하려면 어떻게 해야 합니까?s2_file1s2_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_files2/file

이름을 바꾸기 전에 어떤 파일 이름이 중복되는지에 대한 보고서를 얻으려면 다음을 실행할 수 있습니다( extendedglob옵션이 활성화된 상태에서):

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

열(교차점)에서 print값이 ()가 아닌 연관 배열(역첨자 사용)의 속성 및 속성을 표시합니다 .r2 Cakvcount A^1R

단지 고려정기적인파일(fifo, 디렉토리, 소켓, 장치 등 다른 유형의 파일 제외)에 .glob 한정자( files=($^subdirs/*(N.)))를 추가합니다. 숨겨진 파일이나 숨겨진 하위 디렉터리의 파일도 고려하려면 Dglob 한정자를 추가할 수 있지만 점으로 시작하지 않는 접두사를 추가하면 파일이 더 이상 숨겨지지 않습니다.

관련 정보