строка xargs слишком долго

[117291]Нужно процитировать, чтобы защитить его от расширения ракушки.

apt-get install manpages-dev

То же самое с [117659]rm[117660], [117661]rmdir[117662] и так далее. Оболочка изменяет [117663]~[117664] на [117665]/home/greg[117666] перед передачей ее в команды, если только вы не процитируете ее или не уклонитесь от нее. Вы можете увидеть это с помощью [117667]echo[117668]:

Вы захотите быть осторожными, потому что [117669]rm -Rf ~[117670] будет катастрофой. Я предлагаю, если сомневаюсь, сначала переименовать его ([117671]mv -i \~ newname[117672])) тогда вы можете изучить [117673]newname[117674], чтобы убедиться, что вы хотите удалить его, а затем удалить его.[117296].

1
18.08.2014, 22:16
4 ответа

-Z - выводить NUL после имени каждого файла с помощью grep -l, а не менять новые строки на NUL в выводимых им строках. Так что xargs -0 видит только одну огромную запись (с несколькими символами новой строки), так как NUL не делимитирован, так что это только один аргумент для передачи в rm и он, вероятно, больше максимального размера аргумента (128кБ на Linux) и в любом случае, нет такого файла под названием .... ffd7ba85b0577b90c0fb1b3922303c486127d4...fff0b6886aff6cb4073742fbf7bcc1b47d9b45.

Просто сделайте:

rm [0-9a-f][0-9a-f]*

Или, если список слишком большой:

printf '%s\0' [0-9a-f][0-9a-f]* | xargs -r0 rm

Или с zsh:

autoload zargs        # best in ~/.zshrc
setopt extendedglob   # ditto

zargs [0-9a-f](#c2)* -- rm

Или с ksh93:

command -x rm {2}([0-9a-f])*

Или:

find . ! -name . -prune -name '[0-9a-f][0-9a-f]*' -exec rm {} +

Остерегайтесь, что в не-С локалях [a-f] может совпадать больше, чем [abcdef].

.
6
27.01.2020, 23:17

В зависимости от типа файловой системы вы можете запускаться с ограничением по имени файла. Смотрите:

http://en.m.wikipedia.org/wiki/Comparison_of_file_systems

В частности, в разделе "Ограничения"

Вы можете проверить тип файловой системы, если не знаете, как она используется:

$ cat /etc/fstab

-1
27.01.2020, 23:17

Я бы посоветовал изменить выбранные вами команды на что-то вроде:

 find . -name '^[0-9a-f][0-9a-f]' -print0 | xargs -0 rm

или другой альтернативный вариант

 find . -name '^[0-9a-f][0-9a-f]' -exec rm {} \;
0
27.01.2020, 23:17

Вам будет лучше, чтобы просто найти. Что-то вроде Найти -type F-iname '[0-9A-F] [0-9A-F] *' -delete должен сделать это. Попробуйте сначала с -print вместо -делета, конечно, конечно.

0
27.01.2020, 23:17

Теги

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