Команда, которую необходимо выполнить как hdfs
, короче. Твое что-то вроде:
su -l hdfs -c "hadoop fs -du -s /home/test/*" | awk '{ sum += $1 } END { print sum }'
И лучше использовать sudo
для этой цели:
sudo -u hdfs "hadoop fs -du -s /home/test/*" | awk '{ sum += $1 } END { print sum }'
Это можно сделать одной командой 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
.
Это найдет все файлы в /dir
и запуститmd5sum /dir/file
find /path/to/directory -type f -print0 | xargs -0I{} md5sum {}
Похоже, это работа дляfind
:
find /directory -type f -exec sh -c 'a={}; md5sum -- $a > $a.md5' \;