Проверка подкаталогов на наличие сжатого файла - сжатие, если не существует - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь написать скрипт, который будет проверять подкаталоги на наличие сжатого файла, и, если файл не существует, сжимать необходимый файл.

Я пробовал две версии моего скрипта:

ВЕРСИЯ 1

for directory in /pool/folder/ID*/; do
    echo "Starting for loop"
    if [ -e /pool/folder/ID*/*.txt.gz ]
    then
        echo "file already exists"
    else
        echo "File does not exist"
        echo "file is being compressed"
        gzip *.txt
    fi
done

Это не сработало, и я предположил, что это как-то связано с моим флагом -e: http://www.ducea.com/2009/03/05/bash-tips-if-e-wildcard-file-check-too-many-arguments/

После запуска моего оператора "if" вывод терминала выглядит так, как будто он пытается проверить все подкаталоги на моем компьютере:

Показать все 4854 возможностей? (y или n)

И затем он перечисляет все каталоги. Поэтому я попытался удалить свой флаг -e и использовать ls:

VERSION 2

for directory in /pool/folder/ID*/; do
    echo "Starting for loop"
    files=$(ls /pool/folder/ID*/*.txt.gz 2> /dev/null | wc -l)
    if [ **"$files" != "0"** ]
    then
        echo "zipped file already exists"
    else
        echo "Zipped file does not exist"
    fi
done

Но произошло то же самое (перечисление всех каталогов).

1 Ответ

0 голосов
/ 13 января 2020

Это то, что вы после? Это войдет в каталог dir и проверит все файлы там. Если файл уже распакован, перейдите, если файл не распакован, заархивируйте его.

for dir in /pool/folder/ID*; do
    [ -d "${dir}" ] || continue
    printf "processing %s\n" "${dir}"
    for file in "${dir}"/*.txt; do
       if [ -f "${file}.gz" ]; then
          printf "%s already compressed\n" "${file}"
       elif [ -f "${file}" ]; then
          printf "%s being compressed\n" "${file}"
          gzip "${file}"
       fi
    done
done

Немного короче будет:

for dir in /pool/folder/ID*; do
    [ -d "${dir}" ] || continue
    printf "processing %s\n" "${dir}"
    for file in "${dir}"/*.txt; do
       [ -f "${file}.gz" ] && printf "%s already compressed\n" "${file}" && continue
       [ -f "${file}" ] && printf "%s being compressed\n" "${file}" && gzip "${file}"
    done
done
...