У меня есть длинный текстовый файл со списком масок файлов, которые я хочу удалить
Пример:
/tmp/aaa.jpg
/var/www1/*
/var/www/qwerty.php
Мне нужно их удалить. Пробовал rm `cat 1.txt`, и он говорит, что список слишком длинный.
Нашел эту команду, но когда я проверяю папки из списка, в некоторых из них все еще есть файлы.
xargs rm <1.txt
Ручной вызов rm удаляет файлы из таких папок, поэтому нет проблем с разрешениями.
Ответы:
Это не очень эффективно, но сработает, если вам нужны шаблоны глобусов (например, / var / www / *).
Если у вас нет шаблонов и вы уверены, что ваши пути в файле не содержат пробелов или других странных вещей, вы можете использовать xargs следующим образом:
источник
Предполагая, что список файлов находится в файле
1.txt
, выполните:Параметр
-r
вызывает рекурсию в любые каталоги, указанные в1.txt
.Если какие-либо файлы доступны только для чтения, используйте
-f
опцию принудительного удаления:Будьте осторожны с вводом в любой инструмент, который выполняет программное удаление. Сделать уверены , что файлы , перечисленные в файле ввода действительно должны быть удалены. Будьте особенно осторожны с кажущимися простыми опечатками. Например, если вы введете пробел между файлом и его суффиксом, это будет выглядеть как два разных имени файла:
на самом деле два отдельных файла:
file
и.txt
.Это может показаться не таким уж опасным, но если опечатка будет примерно такой:
Тогда вместо того , чтобы удалить все файлы, начинающиеся с
myoldfiles
, вы в конечном итоге удалениеmyoldfiles
и все не-дот-файлы и директории в текущей директории. Наверное, не то, что вы хотели.источник
Использовать это:
Если вам нужно расширение glob, вы можете не цитировать
$file
:Но имейте в виду, что имена файлов могут содержать «проблемный» контент, и я бы использовал версию без кавычек. Представьте себе этот узор в файле
Это удалит довольно много из текущего каталога! Я бы посоветовал вам подготовить список удаления таким образом, чтобы шаблоны глобусов больше не требовались, а затем использовать цитирование, как в моем первом примере.
источник
/My Dir With Spaces/
/Spaces and globs/*.txt
,--file-with-leading-dashes
и в качестве бонуса это POSIX и работает на GNU / Linux, MacOS и BSD.Вы можете использовать '\ n' для определения символа новой строки как разделителя.
Будьте осторожны с -rf, потому что он может удалить то, что вы не хотите, если 1.txt содержит пути с пробелами. Вот почему новый разделитель строк немного безопаснее.
В системах BSD вы можете использовать параметр -0, чтобы использовать символы новой строки в качестве разделителя, например:
источник
xargs: illegal option -- d
-0
OS X.xargs -I_ rm _
также работает в OS X :) см. stackoverflow.com/a/39335402/266309-d
), вы можете сначала преобразовать символы новой строки в нули:tr '\n' '\0' < 1.txt | xargs -0 rm
Вы можете использовать этот однострочник:
Что делает расширение оболочки, но выполняется
rm
минимальное количество раз.источник
-n <n>
аргумент, чтобыxargs
уменьшить количество аргументов, передаваемых каждому rm, но это все равно не защитит вас от единственного глобуса, превышающего лимит.xargs -I{} sh -c 'rm {}' < 1.txt
должен делать то, что хочешь. Будьте осторожны с этой командой, поскольку одна неверная запись в этом файле может вызвать много проблем.Этот ответ был отредактирован после того, как @tdavies указал, что в оригинале не выполнялось расширение оболочки.
источник
xargs -I{} sh -c 'rm {}' < 1.txt
В этом конкретном случае из-за опасностей, указанных в других ответах, я бы
Отредактируйте, например, в Vim и
:%s/\s/\\\0/g
, экранируя все символы пробела обратной косой чертой.Затем
:%s/^/rm -rf /
, добавив команду. С-r
вами не придется беспокоиться иметь каталоги , перечисленные после того , как файлы , содержащиеся в нем, и с-f
ним не будет жаловаться из - за недостающие файлы или повторяющиеся записи.Выполните все команды:
$ source 1.txt
источник
cat 1.txt | xargs rm -f | bash
Выполнение команды сделает следующее только для файлов.cat 1.txt | xargs rm -rf | bash
Выполнение команды приведет к следующему рекурсивному поведению.источник
Чтобы предоставить другой способ, вы также можете просто использовать следующую команду
источник
Вот еще один пример зацикливания. Этот также содержит оператор if в качестве примера проверки, является ли запись «файлом» (или, например, «каталогом»):
источник
Здесь вы можете использовать набор папок из deletelist.txt в то время как избежать некоторых моделей , а также
источник
Это позволит именам файлов иметь пробелы (воспроизводимый пример).
источник
В случае, если кто-то предпочитает
sed
удаление без подстановки :Напоминание: используйте в файле абсолютные пути или убедитесь, что вы находитесь в правильном каталоге.
И для полноты то же самое с
awk
:Расширение подстановочных знаков будет работать, если удалить одинарные кавычки, но это опасно, если имя файла содержит пробелы. Для этого нужно будет добавить кавычки вокруг подстановочных знаков.
источник