2つのサブディレクトリがあり、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
(および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_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修飾子を追加できますが、ドットで始まらないプレフィックスを追加すると、ファイルは非表示になりません。