2つのサブディレクトリで同じ名前のファイルの名前を変更するには?

2つのサブディレクトリで同じ名前のファイルの名前を変更するには?

2つのサブディレクトリがあり、s1s2サブディレクトリにはandというファイルがありますfile_1file_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(および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_files2/file

名前を変更する前にどのファイル名が重複しているかに関するレポートを取得するには、次のことを実行できます(extendedglobオプションが有効な状態で)。

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

列(交差点)のprint値が()ではなく、連想配列(逆添字を使用)の属性と属性を表示します。r2 Cakvcount A^1R

ただ考慮定期的なファイル(fifo、ディレクトリ、ソケット、デバイスなど、他の種類のファイルを除く)に.glob修飾子(files=($^subdirs/*(N.)))を追加します。隠しファイルや隠しサブディレクトリのファイルも考慮するには、Dglob修飾子を追加できますが、ドットで始まらないプレフィックスを追加すると、ファイルは非表示になりません。

関連情報