(Предупреждение: Я не протестировал ни одной из этих команд. Могут быть опечатки или ошибки. Попробуйте все echo
или ls
и нет sudo
сначала.)
Общие рекомендации: xargs
редко самый простой способ сделать что-то. Без -i
(который удерживается от использования между прочим, используйте портативное устройство -I {}
вместо этого), xargs
ожидает формат ввода, который не производит никакой стандартный или общий инструмент. С -I
, xargs
действительно имеет некоторое использование, хотя, если Вы передаете по каналу find
в него, find -exec
более просто.
Вам нужна оболочка для расширения {}/*
, и та оболочка должна действовать после {}
был заменен одним фактическим путем. Простое решение состоит в том, чтобы сделать линию за линией обработку в оболочке. Отметьте использование трех шаблонов для получения всех файлов в каталоге как *
опускает точечные файлы; не имеет значения, если некоторые шаблоны не соответствуют никакому файлу, как rm -f
игнорирует любой аргумент, который не ссылается на существующий файл.
… |
while read -r line; do
sudo rm -rf -- "$line"/* "$line"/.[!.]* "$line"/..?*
done
Xargs бесполезен здесь, так как необходимо обработать файлы один за другим так или иначе в какой-то момент, чтобы заставить оболочку выполнять globbing. Поскольку общая техника может быть полезной однако, вот способ подать имена файлов назад в оболочку от xargs. _
$0
аргумент оболочке (этому не придется там частично потрудиться придерживаться $0
назад на любой последующий аргумент, и гарантировать, что все работает даже если $1
начинается с a -
и так иначе рассматривался бы как опцию к оболочке). Здесь существует два подхода: или имейте цикл оболочки по его аргументам или скажите xargs передавать отдельный аргумент каждому вызову оболочки.
… | xargs -I {} sudo sh -c 'for x; do rm -rf -- "$x"/* "$x"/.[!.]* "$x"/..?*; done' _ {}
… | xargs -I {} -n 1 sudo sh -c 'rm -rf -- "$1"/* "$1"/.[!.]* "$1"/..?*' _ {}
Я принимаю это ls -d a*
игрушечный пример и что у Вас есть более сложная команда, которая производит одно имя файла на строку. Отметьте это ls -d a*
не работал бы там, как большинство ls
реализации не производят непечатаемые символы прозрачно. Если …
команда находки, использовать -exec
, как в
find a* -exec sh -c 'rm -rf -- "$1"/* "$1"/.[!.]* "$1"/..?*' _ {} \; -prune
Это действительно имеет место. 389 родительский проект для этих сервисов. Имя изменилось на это, чтобы лишить от брендинга того, чтобы быть "Red Hat" и поощрить принятие через другие разновидности Linux.