4

У меня есть скрипт, который загружает 17 файлов с FTP-сервера каждый раз, но иногда некоторые файлы весят "0" по некоторым причинам.

Поэтому я ищу bash-скрипт, который проверяет, есть ли файлы с нулевым размером.

Как я мог это сделать?

РЕДАКТИРОВАТЬ: Я хотел бы использовать оператор if-else: если были какие-либо 0-байтовые файлы, мне придется снова запустить скрипт bash.

1 ответ1

7

Если вы просто хотите перечислить 0-байтовые файлы, вы можете использовать find:

Пример использования find:

$ find . -type f -size 0b
./4.txt
./5.txt
./6.txt

Преимущество использования find заключается в том, что вы можете легко передать его в xargs чтобы сделать с файлами то, что вам нужно (например, удалить их), что гораздо проще, чем использовать цикл for .

Если вы хотите что-то сделать с этими файлами после их поиска, например, удалив все 0-байтовые файлы (учитывая странные имена файлов), я бы сделал что-то вроде этого:

$ find -type f -size 0b -print0 | xargs -0I file rm -v file
removed ‘./4.txt’
removed ‘./5.txt’
removed ‘./6.txt’

Кроме того, другой вариант, чтобы просто перечислить все файлы в каталоге вместе с размером файла в удобочитаемом формате, использовать du -h .

Пример использования du:

$ du -h *
1.0K    1.txt
1.0K    2.txt
1.0K    3.txt
0       4.txt
0       5.txt
0       6.txt

РЕДАКТИРОВАТЬ: Пока вы знаете, как найти пустые файлы, вы можете выполнять дополнительные операции несколькими способами. Следующий пример, возможно, не лучший способ сделать это, но если вы абсолютно ищете оператор if/else , то вы можете сделать что-то вроде этого:

#!/bin/bash

for i in *; do
  if [[ $(du -h "$i" | awk '{print $1}') = 0 ]]; then
    echo "$i is empty."
  else
    echo "$i is not empty."
  fi
done

Возвращает:

1.txt is not empty.
2.txt is not empty.
3.txt is not empty.
4.txt is empty.
5.txt is empty.
6.txt is empty.

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