ファイルを既存のディレクトリにコピーし、名前は同じですが、拡張子が異なる既存のファイルを削除する必要があります。

ファイルを既存のディレクトリにコピーし、名前は同じですが、拡張子が異なる既存のファイルを削除する必要があります。

編集する:明確にするために、質問は完全に書き直されました。

私はディレクトリツリー(新しい)といくつかの拡張機能が .newあります。同じツリー(古い)その多くは、次のような名前のファイルを持っています。新しい拡張子を除くすべてのファイルを.oldコピーしたいです。.new新しいディレクトリツリーエントリ古いファイルを含むディレクトリツリー.old。拡張子を持つファイルを.new書き込むとき古い.oldディレクトリツリーの名前は同じですが、拡張子を持つファイルを削除したいと思います。

もしそうなら、新しいnew/foo/bar/file.newディレクトリツリーには、コピーする名前のファイルがあります。古いディレクトリツリーは、ファイルが終了するold/foo/bar/file.newold/foo/bar/file.oldファイルが削除されます。

編集#1

この回答は以下で議論されます(関連のない背景情報を混乱させる古い質問を使用して)。答えの1つとして、以下に定式化された実際のソリューションをご覧ください。

答え1

基本的な方法は、mp3ファイルを含むディレクトリで実行することです。

for i in *.mp3; do cp "$i" /path/to/flac/ && rm path/to/flac/"${i%.*}".flac; done

名前で終わるすべてのファイルを繰り返し、.mp3各ファイルを/path/to/flac/flacファイルを含むディレクトリにコピーし、コピーが成功した場合, その.flacファイルを削除します。秘訣はシェルを使うことです。文字列演算機能を使用すると${i%.*}拡張子が削除されるため、現在のmp3ファイルと同じ名前ですが、拡張子は同じファイルをrm ${i%.*}.flac削除します。.flac

表示するには:

$ foo='abc.def'
$ echo ${foo%.*}
abc

答え2

これはterdonsの回答に関するコメントで議論された最終回答です。

cd new
for i in */*/*.new; do cp "$i" "path/to/old/${i}" && rm "path/to/old/${i//new/old}"; done

関連情報