Это можно сделать одной командой find
:
find. -type f ! -name 'md5_*' -execdir sh -c \
'for f; do
b="$(basename "$f")"
[ ! -e "md5_$b" ] || [ "$b" -nt "md5_$b" ] && md5sum "$b" > "md5_$b"
done' sh {} +
Параметр ! -name 'md5_*
исключает md5-файлы _*, а параметр -execdir
заставляет find выполнять cd для каждого каталога, содержащего файлы, а затем запускать в нем команду sh -c '....'
. Он запускает как можно меньше sh -c...
команд в каталоге (обычно только одну, в зависимости от максимального ограничения командной строки в вашей системе -обычно 2 МБ или более в наши дни ).
Тест [ ! -e "md5_$b" ] || [ "$b" -nt "md5_$b" ]
в сценарии оболочки гарантирует, что md5sum
выполняется только для файлов, в которых либо файл md5_
не существует, либо если файл новее, чем его файл md5_
.
Если бы вы хотели иметь только один md5sums.txt
файл в каждом каталоге, это было бы проще:
find. -type f ! -name 'md5sums.txt' -execdir sh -c \
'md5sum "$@" >md5sums.txt' sh {} +
и даже проще, если вам нужен только один md5sums.txt
файл со списком всех файлов во всех подкаталогах:
rm -f md5sums.txt
find. -type f -exec md5sum {} + >> md5sums.txt
Эта версия должна работать с версией Busybox find
и, возможно, с другими минималистскими версиями:
find. -type f ! -name 'md5_*' -exec sh -c \
'for f; do
cd "$(dirname "$f")"
b="$(basename "$f")"
[ ! -e "md5_$b" ] || [ "$b" -nt "md5_$b" ] && md5sum "$b" > "md5_$b"
cd - >/dev/null
done' sh {} +
Он будет работать немного медленнее, потому что он должен изменить каталог в сценарии оболочки... и он должен сделать cd
дважды для каждого файла, а не только один раз для каждого каталога.
Я бы использовал pushd
и popd
для изменения каталогов, но если вы используете busybox find или подобное, вы, вероятно, также используете минималистский sh
, например dash
.
Ошибка тайм-аута блокировки.Xauthority обычно возникает из-за проблем с записью в файл. Типичные причины этого включают:
Судя по обсуждениям в комментариях, ваша проблема — последняя из перечисленных.
Чтобы убедиться, что проблема именно в этом, запустите ls -ld ~
, чтобы проверить права доступа к вашему домашнему каталогу. Скорее всего, либо у вас нет прав на запись, либо вы не являетесь владельцем каталога. chmod u+w ~
исправит первое, chown $USER ~
исправит второе.