Может быть, что-то вроде этого:
find . -type d -print0 | while read -r -d '' dir; do file="$(find "$dir" -maxdepth 1 -type f -printf '%T+ %p\n' | sort -r | head -1 | cut -d' ' -f2-)";if [ -n "$file" ]; then touch "$dir" -mr "$file"; fi; done
Объяснение:
Чтобы передать дату модификации из одного файла в другой, нам нужно выполнить:
touch file1 -mr file2
Сначала мы должны найти подкаталоги:
find . -type d -print0 | while read -r -d '' dir; do echo "$dir"; done
В этом случае -exec
опция будет слишком сложной, поэтому я использую подход с чтением. Вы должны убедиться, что выводите данные с find
помощью в NUL
качестве разделителя записей, и попросите read
разделить на них ( -d ''
).
Для поиска файлов с последней датой модификации я могу использовать:
find ./ -maxdepth 1 -type f -printf '%T+ %p\n' | sort -r | head -1 | cut -d' ' -f2-
Сочетая это:
find . -mindepth 1 -type d -print0 | while read -r -d '' dir; do file="$(find "$dir" -maxdepth 1 -type f -printf '%T+ %p\n' | sort -r | head -1 | cut -d' ' -f2-)";echo "$dir <- $file"; done
Наконец, добавление прикосновения:
find . -mindepth 1 -type d -print0 | while read -r -d '' dir; do file="$(find "$dir" -maxdepth 1 -type f -printf '%T+ %p\n' | sort -r | head -1 | cut -d' ' -f2-)";touch "$dir" -mr "$file"; done
Я использую -mindepth
опцию здесь, потому что я запустил эту команду из каталога, содержащего dir_a, у которого нет файла для чтения даты. Чтобы устранить эту проблему, я могу использовать if-else, чтобы убедиться, что я не пытаюсь прочитать время из несуществующего файла:
find . -type d -print0 | while read -r -d '' dir; do file="$(find "$dir" -maxdepth 1 -type f -printf '%T+ %p\n' | sort -r | head -1 | cut -d' ' -f2-)";if [ -n "$file" ]; then touch "$dir" -mr "$file"; fi; done