На оболочке удара UNIX (конкретно Mac OS X Leopard), каков был бы самый простой способ скопировать каждый файл, имеющий определенное расширение от иерархии папок (включая подкаталоги) к той же папке назначения (без подпапок)?
Очевидно, существует проблема наличия дубликатов в исходной иерархии. Я не возражал бы, если они перезаписываются.
Пример: Я должен скопировать каждый .txt файл в следующей иерархии
/foo/a.txt
/foo/x.jpg
/foo/bar/a.txt
/foo/bar/c.jpg
/foo/bar/b.txt
К папке, названной 'dest' и доберитесь:
/dest/a.txt
/dest/b.txt
Приведенные выше ответы не допускают конфликтов имен, поскольку спрашивающий не возражал против перезаписи файлов.
Я не возражаю против перезаписи файлов, поэтому придумал другой подход. Заменив каждый / в пути на - сохраните иерархию в именах и поместите все файлы в одну плоскую папку.
Мы используем find для получения списка всех файлов, затем awk для создания команды mv с исходным именем и измененным именем файла, а затем передаем их в bash для выполнения.
find ./from -type f | awk '{ str=$0; sub(/\.\//, "", str); gsub(/\//, "-", str); print "mv " $0 " ./to/" str }' | bash
где ./from и ./to - это каталоги, из которых и в mv.