4

Я хотел бы сократить большую базу данных из командной строки до N файлов, очень похоже на этот вопрос. Единственное отличие состоит в том, что большинство моих файлов находятся в подкаталогах, поэтому мне было интересно, было ли быстрое решение моей проблемы или потребовалось бы более глубокое действие. В настоящее время моя команда выглядит так (с заменой (N+1) на соответствующий номер):

find . -type f | sort -R | tail -n +(N+1) | xargs rm

Первоначально я думал, что это будет работать, потому что поиск по своей природе является рекурсивным, а затем я попытался добавить -r (рекурсивный флаг) вокруг rm поскольку вывод указывает, что он выбирает файлы случайным образом, но не может найти их для удаления. Есть идеи?

РЕДАКТИРОВАТЬ: моя новая команда выглядит так:

find . -type f -print0 | sort -R | tail -n +(N+1) | xargs -0 rm

и теперь я получаю сообщение об ошибке rm: missing operand . Кроме того, я нахожусь на компьютере с CentOS, поэтому флаг -z для меня недоступен.

РЕДАКТИРОВАТЬ # 2 Эта команда работает:

find . -type f -print0 | sort -R | tail -n +(N+1) | xargs -0 -r rm

но когда я выполняю find . -type f | wc -l для получения количества файлов в каталоге (которое должно быть N, если команда работала правильно) не изменилось от начального количества файлов.

2 ответа2

1

Если вам нужно использовать find … -print0 и вы не можете использовать -z с sort и / или tail , существует возможный, но громоздкий обходной путь (как обычно, замените (N+1) ):

find . -type f -printf "%i\n" | sort | uniq | sort -R | tail -n +(N+1) |
   while read i; do
      find . -type f -inum "$i" -delete
   done

Подвох в том, что мы используем номера инодов вместо путей.

Внутренняя find удаляет все файлы с указанным номером инода в текущем каталоге, поэтому, если некоторые файлы жестко связаны друг с другом, вы либо потеряете их все, либо сохраните их все.

Предварительная sort | uniq - это предотвращение неудачи, когда вы теряете слишком много из-за дублирования номеров инодов из-за жестких ссылок. Вы можете получить более N имен файлов, указывая в общей сложности до N различных инодов.

Если ваша find не понимает -delete , используйте -exec rm {} +.

0

Я сделал это на OSX, как

find . -type f -print | sort | uniq | sort --random-sort | tail -n +1000 | xargs rm -f

Где мой N был 1000 . Затем вы можете дважды проверить правильность количества оставшихся файлов с помощью команды ls | wc -l Смотрите также https://stackoverflow.com/a/20307392/630752

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