
ファイル名は似ていますが、拡張子が異なる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
名とファイル拡張子を削除するために使用されます。comm
2つのリストを比較します。
例:
$ 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 -23
dir1に固有のファイル名がすべて表示され、comm -13
dir2に固有のファイル名が表示されます。