0

2 つのディレクトリを比較するスクリプトを書きたいと思います。ただし、そのうちの 1 つでファイル名が変更されます。したがって、ディレクトリ A には、HouseFile.txt、CouchFile.txt、ChairFile.txt などのファイルが含まれます。ディレクトリ B には、House.txt、Couch.txt、Chair.txt が含まれます (これらは上記と「同等」と見なされます)。まったく別のファイル。

誰かが私をここで正しい方向に向けることができますか? スクリプトを作成するのは久しぶりです。

を使用してみましたが、ファイル名を比較するdiffために何らかの形式の を使用する必要があることはわかってregexいますが、どこから始めればよいかわかりません。

ありがとうございました!

明確化のために追加:

もちろんdiff、ただし、実際のファイル名を比較するだけです。この場合、例の「HouseFile.txt」と「House.txt」などのファイル名を同等と見なすように指定する方法を知りたい

4

1 に答える 1

2

私が正しく理解していれば、これはaとbを比較するための可能な解決策です:

mkdir a b ; touch a/HouseFile.txt a/ChairFile.txt a/CouchFile.txt a/SomeFile.txt b/House.txt b/Chair.txt b/Couch.txt b/Sofa.txt

for file in a/*(.); do [[ ! -f b/${${file##*/}:fs@File@} ]] && echo $file ; done

出力: a/SomeFile.txt

私には明確ではないこと: 差分パターンは厳密に「ファイル」または任意の文字列ですか?

編集: 前は zsh 用でした。これはbash用のものです:

find a -type f -maxdepth 1 | while read file; do
  check=$(echo $file | sed -r -e 's@(.*)/(.*)@\2@' -e "s@File@@") ;
  [[ ! -f b/${check} ]] && echo $file
done

の代わりにパラメーター展開を使用するsed:

find a -type f -maxdepth 1 | while read file; do
  check=${file/%File.txt/.txt} #end of file name changed
  check=${check/#*\//} #delete path before the first slash
  [[ ! -f b/${check} ]] && echo $file
done
于 2012-06-17T15:35:52.903 に答える