Пожалуйста, найдите ниже скрипт:

#!/bin/bash
for index in `ls -1 /appdata/frozen_files`
do
 for bucket in `find /appdata/frozen_files/$index -name "*.gpg~" | cut -d/ -f4-5`
   do
    for files in `ls /appdata/frozen_files/$bucket/rawdata | wc -l`
     do
      if [[ ` "$files" -eq 1 && "file extension = .gpg~" ` ]];
       then
        echo $bucket >> /tmp/NAS_buckets_with_less_than_2_files.txt
      fi
     done
   done
 done

намерение: я пытаюсь найти расширение файла = .gpg ~, заканчивающееся тильдой (~). имя файла пример = journal.gz.gpg ~ .. .gpg ~ файлы доступны в /appdata /frozen_files /$ bucket /rawdata | туалет

Можем ли мы создать переменную, которая содержит расширение файла, глядя на систему есть с чем сравнить.

что-то, что может проверить расширение файла (.gpg ~)

1 ответ1

0

Я не уверен, что понимаю, что вы пытаетесь сделать.

При этом будут напечатаны все каталоги с именем rawdata из /appdata/frozen_files/ которые содержат менее двух файлов с именами, заканчивающимися на .gpg~ (файлы в подкаталогах rawdata не учитываются):

find /appdata/frozen_files/ -type d -name "rawdata" -exec \
   sh -c '
      cd "$1" || exit 1
      num=$(find . ! -name . -prune -type f -name "*.gpg~" -exec printf "\n" \; | wc -l)
      [ "$num" -lt 2 ]
   ' sh {} \
\; -print

Процедура такова:

  1. Внешняя find находит все rawdata .
  2. Для каждого такого каталога sh вызывается; каталог доступен как "$1" внутри предоставленной команды.
  3. Эта оболочка cd -s для каталога и запускает внутреннюю find .
  4. Эта find печатает новую строку для каждого *.gpg~ файла прямо в каталоге.
  5. Эти новые строки считаются wc .
  6. Результат (число) сохраняется как переменная num .
  7. Результат проверяется, если он ниже 2 .
  8. Если тест пройден успешно, внешняя команда find печатает каталог.

Заметки:

  • Есть несколько решений из-за портативности и соответствия POSIX:
    • ! -name . -prune вместо -maxdepth 1 ,
    • -exec printf "\n" \; вместо -printf "\n" .
  • Переменная используется для повторного использования, например:

    [ \( "$num" -gt 2 \) -a \( "$num" -lt 10 \) ]
    
  • Используйте -print0 вместо -print если вам нужно проанализировать вывод безопасным способом.

  • Проанализируйте вывод или измените команду, чтобы извлечь только часть каждого полученного вами пути; Например, вместо -print вы можете использовать:

    -exec sh -c 'basename "$(dirname "$1")"' sh {} \;
    

    получить родительский каталог для всех rawdata , соответствующих критериям.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .