両方のディレクトリを比較しますが、拡張子は無視します。

両方のディレクトリを比較しますが、拡張子は無視します。

ファイル名は似ていますが、拡張子が異なる2つのディレクトリがあります。例は次のとおりです。

DIR1:
 - IN89284.wav
 - OUT9920.wav

DIR2:
 - IN89284.mp3
 - OUT9920.mp3

このディレクトリを比較したいのですが、ファイル拡張子を無視するので、この場合は同じです。どうすればいいですか?最初のディレクトリを繰り返し、各ファイル名をトリミングして(拡張子を切り取った後)、2番目のディレクトリから検索する必要があります。もっと良い方法がありますか?

答え1

diff  <(ls -1 ./dir1 | sed s/.wav//g) <( ls -1 ./dir2 | sed s/.mp3//g) 

ディレクトリを一覧表示し、各ファイルを別々の行に配置します。

   ls -1 

ファイル拡張子の削除

    sed s/.wav//g

答え2

そしてzsh

diff -u <(cd dir1 && printf '%s\n' **/*(D:r)) \
        <(cd dir2 && printf '%s\n' **/*(D:r))

(D)ドットファイル(隠しファイル)を含み、:rルート名を取得します(拡張子を削除)。

ワイルドカードを使用すると、一貫したソート順序が保証されます。

(ファイル名に改行文字がないと仮定)。

答え3

次のコマンドを使用できます。

comm -12 <(find dir1 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort) <(find dir2 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort)

findこれは、各ディレクトリのすべてのファイルを一覧表示し、パラメータ置換を使用してディレクトリbasename名とファイル拡張子を削除するために使用されます。comm2つのリストを比較します。

例:

$ tree
.
|-- dir1
|   |-- test1.txt
|   |-- test2.txt
|   `-- test3.txt
`-- dir2
    |-- test2.txt
    `-- test4.txt

$ comm -12 <(find dir1 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort) <(find dir2 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort)
test2
$ comm -23 <(find dir1 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort) <(find dir2 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort)
test1
test3
$ comm -13 <(find dir1 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort) <(find dir2 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort)
test4

comm -12両方のディレクトリに共通のすべてのファイル名が表示されます。comm -23dir1に固有のファイル名がすべて表示され、comm -13dir2に固有のファイル名が表示されます。

関連情報