С помощью zsh
из текущего каталога:
for dir (**/*(N/)) {
files=($dir/*(N.om))
(($#files > 1)) && echo rm -f -- $files[2,-1]
}
Если вы хотите, чтобы учитывались скрытые каталоги и файлы, добавьте квалификатор глобуса D
.
Учитываются только обычные файлы. Если вам нужны другие типы файлов, такие как устройства, сокеты, именованные каналы, или если вы хотите следовать символическим ссылкам, их можно адаптировать с помощью дополнительных квалификаторов glob.
Удалите эхо
, чтобы фактически выполнить задачу.
С последними инструментами GNU и оболочкой POSIX:
(export LC_ALL=C
find . -type f -printf '%T@\t%p\0' |
sort -rzn |
cut -zf2- |
gawk -v RS='\0' -v ORS='\0' '
match($0,/.*\//) && n[substr($0,1,RLENGTH-1)]++' |
xargs -r0 echo rm -f
)