Я понимаю, что любой вопрос, касающийся удаления файлов, должен приниматься с большой осторожностью. Мой первый ответ был слишком поспешным, я не учел тот факт, что список файлов может быть искажен для использования с egrep. Я отредактировал ответ, чтобы уменьшить этот риск.
Это должно работать для файлов, у которых нет места в имени:
Сначала перестройте свой список файлов, чтобы убедиться, что он совпадает с точным именем файла:
sed -e 's,^,^,' -e 's,$,$,' filelist > newfilelist
построить команды rm
cd your_directory
ls | egrep -vf newfilelist | xargs -n 1 echo rm > rmscript
Проверьте, подходит ли вам скрипт rm (вы можете сделать это с помощью «vim» или «less»).
Затем выполните действие:
sh -x rmscript
Если у файлов есть пробелы в имени (если у файлов есть имя "
в имени, это не будет работать):
ls | egrep -vf newfilelist | sed 's,^\(.*\)$,rm "\1",' > rmscript
конечно, список файлов не должен быть в одном каталоге!
ИЗДАНО:
Список файлов Натана содержал имена, соответствующие всем файлам в каталоге (например, «html» соответствует «bob.html»). Так что ничего не удалялось, потому что egrep -vf
поглотил весь поток. Я добавил команду, чтобы поставить «^» и «$» вокруг каждого имени файла. Мне повезло, что список файлов Натана был верным. Если бы он был отформатирован в DOS с завершающими строками CR-LF или с дополнительными пробелами, egrep не сохранил бы никаких файлов и все они были бы удалены.
ls
обеспечивает имена файлов каталога,egrep -vf filelist
фильтрует ваши 50 имен файлов. Боюсь, вы удалили все свои файлы.Предварительно сконструируйте аргументы для
find
:Используйте
echo
части, чтобы увидеть, что будет построено. Удалитеecho
части, чтобы фактически запустить это.Обновление: Демонстрация:
источник
'
) следует добавить тоkeep=( -name \'"$REPLY"\' )
иkeep+=( -o -name \'"$REPLY"\' )
.С
zsh
:Он считывает строки
filelist
в массиве, а затем использует glob qualifiers /e
string для выделения / выбора только имен файлов, не представленных в массиве:.
выбирает только обычные файлы (добавьте,D
если ваш список содержит точечные файлы), а отрицание^e_'expression'_
дополнительно выбирает только те, для которых которое выражение возвращает false, т.е. если их name ($REPLY
) не является элементом массива .Если вы довольны результатом замены
print -rl
сrm
фактически удалить файлы:Чтобы рекурсивно выбирать и удалять файлы, используйте
*/**
glob с${REPLY:t}
модификатором glob:источник
Если вы поместите содержимое каталога в файл следующим образом:
Откройте список файлов в текстовом редакторе и удалите все файлы, кроме тех, которые ВЫ ХОТИТЕ УДАЛИТЬ . Это смелый, потому что это противоположный подход к ответу выше
Попробуй это:
Если вы видите список файлов, выводимых на экран, замените echo
rm -v
следующим образом:источник
Запустите приведенный ниже скрипт.
all_files
.not_to_be_deleted_files
).not_to_be_deleted_files
иfiles_to_be_deleted
в концеnot_to_be_deleted_files
как нам нужны эти 2 файла.join
команду linux, и перенаправляю вывод вfiles_to_be_deleted
файл.files_to_be_deleted
и удаляю файлы, упомянутые в этом имени файла.Сценарий как ниже.
PS : Возможно, если вы хотите сохранить это как скрипт и запустить его, вы можете добавить имя скрипта также используя
echo scriptname >> not_to_be_deleted_files
.Хотя это и не обязательно, я предпочитаю делать это, потому что потом не будет сожалений. Я проверил небольшой набор файлов, и он работал в моей системе. Однако, если вы хотите быть уверенным, попробуйте сначала в
test
каталоге, а затем удалите файлы в исходном каталоге.источник
источник
Я пошел к более безопасному и намного более быстрому подходу, потому что у меня было 18 000 файлов в списке! Мне нужно было очистить изображения в большой установке Drupal.
Удаление всех файлов, которых нет в списке, равнозначно сохранению только тех, которые находятся в списке. Поэтому я решил скопировать файлы из списка в другое место, но копирование 20 ГБ файлов заняло бы слишком много места и также было бы очень медленным. Таким образом, хитрость заключается в том, чтобы скопировать файлы
hardlinks
, используя вместо этого, используя-l
параметрcp
. Это почти не занимает места и очень быстро. Кроме того, поскольку мне нужно было сохранить структуру каталогов, я использовал эту--parents
опцию.Вот выдержка из моего списка файлов:
Таким образом, пример строки будет с temp, являющейся местом назначения:
Это создаст эту структуру:
Обратите внимание, что назначение должно быть в той же файловой системе, что и источник для работы жестких ссылок.
Следующим шагом является создание сценария:
Теперь, предполагая, что вы уже создали пустой каталог dir / some / where / temp, вы можете скопировать файлы следующим образом:
Обратите внимание, как ошибки заканчиваются
missing_files
. Дополнительным бонусом этого подхода является то, что вы получите список файлов из исходного списка, которые на самом деле не существуют!После запуска скрипта temp будет содержать только те файлы, которые есть в списке файлов, но ничего не удаляя и не занимая дополнительное место. Если вы удовлетворены результатом, вы можете удалить все оригинальные файлы, включая подпапки.
Наконец, переместите файлы и папки из временного каталога обратно в исходное местоположение.
Для 18 000 файлов это заняло всего несколько секунд.
источник
Безопасно, просто.
cd
в каталог.Создайте временный каталог.
сделанный.
источник