как легко удалить файлы в списке путей?

У меня есть список строк, таких как

/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

?

ПРЕДУПРЕЖДЕНИЕ! Не применять приведенные ниже команды без предварительной проверки вывода

5
задан 9 July 2014 в 22:10

6 ответов

Каков Ваш вход? Файл? Команда? Так или иначе, 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
11
ответ дан 9 July 2014 в 22:10

Можно поместить файлы друг после друга разделенного на пространство. Как так:

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
0
ответ дан 9 July 2014 в 22:10

используйте что-то как блокнот ++, пойдите для замены (ctrl+r), входят->, находят что: \r\n (быть уверенным режим поиска установлен на расширенный), и замена: введите пространство

затем, Вы имеете все в строке

копия оно к оболочке и входите, комната-rf [вставляют file/foldernames из блокнота ++ здесь]

-2
ответ дан 9 July 2014 в 22:10

Передайте вывод по каналу к 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
1
ответ дан 9 July 2014 в 22:10

На очень простом уровне это может быть сделано в 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 также.

1
ответ дан 23 November 2019 в 08:49

Самый легкий путь

cat list.txt | xargs -P 3 rm 

В то время как Вы не можете использовать-P, который по умолчанию выполнил бы как можно больше, но это может быть проблемой, если Ваш список является большим. См. страницы справочника для дальнейшего объяснения.

Один вниз сторона для этого, если бы Ваши файлы имеют пространство на имя, это перестало бы работать. Если это не имело место, можно просто использовать, но если были файлы с пространством на имя, которое Вы ожидаете, так, чтобы в случае, если, удостоверьтесь, что Вы указываете разделитель как символ новой строки.

cat list.txt | xargs -d '\n' -P 3 rm 

На Mac OS это произведет ошибку, но Вы не находитесь на Mac OS, таким образом, Вы хороши для использования этого.

Примечание: Так как это - что-то, что может вызвать потерю данных/конфигурации или нанести вред Вашей установке, всегда рекомендуется использовать, перечисляют файлы прежде на самом деле удалить их. Используйте ls, и если файлы перечислены правильно как ожидалось, изменяются на комнату.

0
ответ дан 23 November 2019 в 08:49

Другие вопросы по тегам:

Похожие вопросы: