Запуск проверки всех файлов во всех подкаталогах

Команда, которую необходимо выполнить как 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 }' 
2
30.08.2019, 18:38
3 ответа

Это можно сделать одной командой 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.

3
27.01.2020, 22:02

Это найдет все файлы в /dirи запуститmd5sum /dir/file

find /path/to/directory -type f -print0 | xargs -0I{} md5sum {}
0
27.01.2020, 22:02

Похоже, это работа дляfind:

find /directory -type f -exec sh -c 'a={}; md5sum -- $a > $a.md5' \;
0
27.01.2020, 22:02

Теги

Похожие вопросы