Grep для определения сброса в каталоге, содержащем все нули, и перечислении или удалении их - PullRequest
1 голос
/ 27 мая 2019

Наличие множества файлов изображений в каталоге, которые были повреждены и содержат только нулевое шестнадцатеричное значение (хотя некоторые очень большие) - среди других изображений, которые не повреждены. Хотите найти в каталоге файлы, которые содержат только нули, и удалите их.

Я запускаю это из терминала на Mac.

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

Или перенесите нулевые файлы в каталог, из которого я могу их удалить (хочу быть осторожным, чтобы не удалить хорошие файлы изображений.)

Ответы [ 2 ]

1 голос
/ 27 мая 2019

find до gawk до xargs очень эффективно.

Пожалуйста, удалите echo безопасность после подтверждения желаемой команды.

#!/bin/bash
mapfile -t Files < <(find . -type f -not -empty)    #1
gawk '
  /[^\x00]/ {f=1; nextfile}                         #2
  ENDFILE {if(!f) print FILENAME; f=0}              #3
' "${Files[@]}" |xargs echo rm                      #4
  1. Рекурсивно хранить все непустые файлы в текущем каталоге в массиве "Файлы"
  2. Если любая строка соответствует символу, отличному от шестнадцатеричного нуля, установите флаг и перейдите к следующему файлу
  3. После nextfile или обычного EOF выведите имя файла, если флаг не установлен, а затем сбросить флаг
  4. Feed gawk наши результаты find, затем используйте xargs для создания одной команды rm.
1 голос
/ 27 мая 2019

Чтобы проверить, содержит ли файл с именем $fname только шестнадцатеричные нули, попробуйте:

head -c "$(wc -c <"$fname")" /dev/zero | cmp -s - "$fname"

Здесь head -c "$(wc -c <"$fname")" /dev/zero создает строку из нулевых байтов точно так же, как файл $fname.cmp -s - "$fname" сравнивает эту строку шестнадцатеричных нулей с самим файлом.Если они совпадают, то cmp устанавливает свой код завершения в success (0).

Чтобы вывести все обычные файлы в каталоге, которые содержат только шестнадцатеричные нули:

for fname in ./*
do
   [ -f "$fname" ] && head -c "$(wc -c <"$fname")" /dev/zero | cmp -s - "$fname" && echo "$fname"
done

Удалить всеобычные файлы в каталоге, которые содержат только шестнадцатеричные нули, мы просто заменяем echo на rm:

for fname in ./*
do
   [ -f "$fname" ] && head -c "$(wc -c <"$fname")" /dev/zero | cmp -s - "$fname" && rm "$fname"
done

Здесь [ -f "$fname" ] проверяет, является ли файл обычным файлом, а не каталогом,head -c "$(wc -c <"$fname")" /dev/zero | cmp -s - "$fname" проверяет, содержит ли файл только шестнадцатеричные нули.Если cmp retursn success, rm "$fname" удаляет этот файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...