Сравните два списка файлов, чтобы найти идентичные файлы, но проигнорируйте расширения

Сравните два списка файлов, чтобы найти идентичные файлы, но проигнорируйте расширения

Я хотел бы найти файлы с расширением wav, имеющие такое же имя, но отличающиеся только расширением (mp3) в том же каталоге.

Я попробовал следующую структурированную команду:

$ diff -s $(for i in *.wav; do echo "${i%wav}"; done) $(for i in *.mp3; do echo "${i%mp3}"; done)
diff: extra operand `abc(xyz'
diff: Try `diff --help' for more information.

решение1

Если вы хотите получить diffвывод некоторых команд, используйтезамена процесса<(...)вместо подстановки команд $(...). В противном случае это должно работать.

diff $(foo)помещает вывод fooв командную строку diff, при этом diffхочет получить имя файла для чтения. diff <(foo)делает вывод fooдоступным из fd и задает diffпуть, соответствующий уже открытому fd ( /dev/fd/NN, может зависеть от системы).


Хотя, перечитав вопрос еще раз, возможно, вы просто захотите сделать что-то вроде этого:

for f in *.wav ; do
    b=${f%.wav}
    if [ -f "$b.mp3" ] ; then echo "$b.mp3 exists" ; else
        echo "$b.mp3 missing" ; fi
done

Это позволило бы определить, все ли .wavфайлы в каталоге имеют соответствующий файл. (Но , конечно, .mp3не отображались бы .mp3файлы, у которых нет соответствующего файла .).wav

Связанный контент