Я хочу найти несколько папок и удалить все, кроме 10 последних.
Я могу find . -maxdepth 1 -type d -name "XXX*" | xargs rm -rf
, но это уберет их всех.
Я не могу использовать head / tail
, потому что я не знаю длину списка. Я думал о том, чтобы передать результат в wc -l
и затем вычесть из него 10, а затем rm -rf
его, но я не знаю, как ...
То, что я до сих пор придумывал, так это :
find . -maxdepth 1 -type d -name "XXX*" | # get the dirs list
wc -l | # count number
xargs -I{} expr {} - $(find . -maxdepth 1 -type d -name "XXX*") # send number to xargs and try to use expr to subtract from it the tail of the find
Я застрял в части expr
и как сократить список, где я хочу
Вот вы:
find . -maxdepth 1 -type d -name "XXX*" -print0 | head -zn-10 | xargs -0 rm -rf
Я проверил это, работает нормально. Обратите внимание, что текущий каталог "."
также считается, если -name "*"
Из man head
:
-n, --lines = [-] NUM [ 115]
blockquote>
печатать первые NUM строки вместо первых 10; с начальным '-' выведите все NUM строки каждого файла, кроме последних