编辑:为了清楚起见,完全重写问题。
我有一个目录树(新的)以及一堆扩展名为 .new
.我有一棵相同的树(老的)其中许多文件的名称与新的树,除了扩展名是.old
.我想复制所有.new
文件新的目录树进入老的包含.old
文件的目录树。当一个带有扩展名的文件.new
被写入老的目录树,我想删除任何具有相同名称但.old
扩展名的文件。
所以,如果在新的目录树中,有一个名为 的文件new/foo/bar/file.new
,它将被复制到老的目录树为old/foo/bar/file.new
,然后old/foo/bar/file.old
如果文件退出,该文件将被删除。
编辑#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
文件。诀窍是使用 shell 的字符串操作功能,${i%.*}
将删除扩展名,因此rm ${i%.*}.flac
将删除与当前 mp3 文件同名但.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