У меня есть список строк, таких как
/usr/lib/i386-linux-gnu/libavfilter.so
/usr/lib/i386-linux-gnu/libavfilter.so.3
/usr/lib/i386-linux-gnu/libavfilter.so.3.42.103
/usr/lib/i386-linux-gnu/i686/cmov/libavfilter.so
/usr/lib/i386-linux-gnu/i686/cmov/libavfilter.so.3
/usr/lib/i386-linux-gnu/i686/cmov/libavfilter.so.3.42.103
/usr/local/lib/libavfilter.so
/usr/local/lib/libavfilter.so.4
/usr/local/lib/libavfilter.so.4.4.100
Как я могу удалить эти файлы в целом, вместо того, чтобы удалять их по одному, как
rm /usr/lib/i386-linux-gnu/libavfilter.so
rm /usr/lib/i386-linux-gnu/libavfilter.so.3
rm /usr/lib/i386-linux-gnu/libavfilter.so.3.42.103
rm /usr/lib/i386-linux-gnu/i686/cmov/libavfilter.so
rm /usr/lib/i386-linux-gnu/i686/cmov/libavfilter.so.3
rm /usr/lib/i386-linux-gnu/i686/cmov/libavfilter.so.3.42.103
rm /usr/local/lib/libavfilter.so
rm /usr/local/lib/libavfilter.so.4
rm /usr/local/lib/libavfilter.so.4.4.100
?
ПРЕДУПРЕЖДЕНИЕ! Не применять приведенные ниже команды без предварительной проверки вывода
Каков Ваш вход? Файл? Команда? Так или иначе, xargs
должно быть полезным:
cat file | xargs rm
... удалит каждый путь для каждой строки в файле. Если это - просто команда, это производит путь на каждой строке, передайте его по каналу через xargs, и это должно работать хорошо.
, С другой стороны, использование xargs --arg-file="file.txt" rm
. Это экономит на канале и ненужная кошка .
, Если Вы надеетесь делать больше с каждой строкой, Вы могли бы использовать традиционный цикл с условием продолжения удара:
# uses echo for testing
# remove # before rm for actual deletion
while read -r path; do
echo "deleting $path"
# rm "$path"
done < file
, Если Ваш список является выводом find
, у Вас есть еще несколько опций, включая -delete
опция или использование -exec rm {} \+
. Существует почти наверняка несколько дюжин других жизнеспособных маршрутов к успеху. При выполнении автоматизированного удаления с находкой просто проверьте вывод перед удалением. Это не простит Вам Ваши ошибки.
Пробелы могут быть проблемой с передачей по каналу вещей в xargs
. Это не могло бы быть проблемой для Вас и Вашего располагающееся, но и locate
и xargs
имеют способ обойти это. Они могут оба принять решение использовать \0
нулевой символ как разделитель вместо возвратных линий. Yay. Короче говоря, Ваша команда становится:
locate -0b libavfilter.so | xargs -0 rm
Можно поместить файлы друг после друга разделенного на пространство. Как так:
rm /usr/lib/i386-linux-gnu/libavfilter.so /usr/lib/i386-linux-gnu/libavfilter.so.3 /usr/lib/i386-linux-gnu/libavfilter.so.3.42.103 /usr/lib/i386-linux-gnu/i686/cmov/libavfilter.so /usr/lib/i386-linux-gnu/i686/cmov/libavfilter.so.3 /usr/lib/i386-linux-gnu/i686/cmov/libavfilter.so.3.42.103 /usr/local/lib/libavfilter.so /usr/local/lib/libavfilter.so.4 /usr/local/lib/libavfilter.so.4.4.100
используйте что-то как блокнот ++, пойдите для замены (ctrl+r), входят->, находят что: \r\n (быть уверенным режим поиска установлен на расширенный), и замена: введите пространство
затем, Вы имеете все в строке
копия оно к оболочке и входите, комната-rf [вставляют file/foldernames из блокнота ++ здесь]
Передайте вывод по каналу к xargs
:
echo "/usr/lib/i386-linux-gnu/libavfilter.so
/usr/lib/i386-linux-gnu/libavfilter.so.3
/usr/lib/i386-linux-gnu/libavfilter.so.3.42.103
/usr/lib/i386-linux-gnu/i686/cmov/libavfilter.so
/usr/lib/i386-linux-gnu/i686/cmov/libavfilter.so.3
/usr/lib/i386-linux-gnu/i686/cmov/libavfilter.so.3.42.103
/usr/local/lib/libavfilter.so
/usr/local/lib/libavfilter.so.4
/usr/local/lib/libavfilter.so.4.4.100" | xargs rm
Или если Ваш список находится в файле:
cat file | xargs rm
На очень простом уровне это может быть сделано в Python:
import os
with open('input.txt') as f:
for line in f:
os.unlink(line.strip())
В случае, если у Вас есть экзотические имена файлов (такой, как создано с touch with$'\n'backslash
или with$'\n'newline
, который является очень плохой идеей, но возможный) Вы могли использовать входной файл в качестве так:
./with\backspace
./with\nnewline
И обработайте все в Python 3 как так:
import os
with open('./input.txt') as f:
for l in f:
# alternatively one can use
# bytes(l.strip(),sys.getdefaultencoding())
bytes_filename = bytes(l.strip(), 'utf-8').decode('unicode_escape')
f_stat = os.stat(os.fsdecode( bytes_filename ) )
print(l.strip(),f_stat)
Существует способ сделать это в Python 2 также.
Самый легкий путь
cat list.txt | xargs -P 3 rm
В то время как Вы не можете использовать-P, который по умолчанию выполнил бы как можно больше, но это может быть проблемой, если Ваш список является большим. См. страницы справочника для дальнейшего объяснения.
Один вниз сторона для этого, если бы Ваши файлы имеют пространство на имя, это перестало бы работать. Если это не имело место, можно просто использовать, но если были файлы с пространством на имя, которое Вы ожидаете, так, чтобы в случае, если, удостоверьтесь, что Вы указываете разделитель как символ новой строки.
cat list.txt | xargs -d '\n' -P 3 rm
На Mac OS это произведет ошибку, но Вы не находитесь на Mac OS, таким образом, Вы хороши для использования этого.
Примечание: Так как это - что-то, что может вызвать потерю данных/конфигурации или нанести вред Вашей установке, всегда рекомендуется использовать, перечисляют файлы прежде на самом деле удалить их. Используйте ls, и если файлы перечислены правильно как ожидалось, изменяются на комнату.