Я хочу работать wc -l
и используйте результат в арифметическом расширении. Другими словами, я хочу сделать что-то вроде этого: wc -l (now somehow pipe/pass the result of this to) $((2 + result of wc command))
Как я могу сделать это?
PS: Вот некоторый контекст
В моем Pictures
каталог, у меня есть несколько файлов, названных "Снимок экрана со дня месяца года hour-minute-second.png", а также другие файлы. Я хочу сохранить все файлы, которые не являются Снимками экрана и только конкретным количеством изображений Снимка экрана, на основе того, насколько недавний они были. Я хочу в основном только сохранить последние 3 новых Снимка экрана, которые я имею и удаляю все остальные.
Таким образом, вот то, что я имею до сих пор: ls | grep "Screenshot *" | sort -r | wc -l
То, что я затем хотел сделать, должно было вычесть 3 из wc -l
, который затем позволил бы мне использовать tail
перечислять все файлы, которые не являются первыми 3 и затем просто удаляют их
Что вы спрашиваете (источник):
cat FILE | wc -l | xargs -n 1 bash -c 'echo $(($1 + 2))' args
bash -c 'commands'
запустить новую среду bash, где $1
— аргумент, заданный xargs
. Используйте man the_commmand
для доступа к справочным страницам и получения дополнительной информации о каждой команде и их параметрах.
Из man bash
:
СИНТАКСИС
xargs [опции] [команда [начальные-аргументы]]
ОПЦИИ
-c
Если- c
, то команды считываются из первого не являющегося параметром аргумента command_string. Если после command_string есть аргументы, первый аргумент назначается $0, а все остальные аргументы назначаются позиционным параметрам. Присвоение $0 задает имя оболочки, которое используется в предупреждениях и сообщениях об ошибках.
$ bash -c 'echo $1' aaa bbb ccc
bbb
$ bash -c 'echo $0' aaa bbb ccc
aaa
$ echo $0
/bin/bash
Поэтому в этом случае вы можете не использовать заполнитель args
(обратите внимание, что вы можете использовать любое слово), просто используя вместо него $0. Кроме того, только для wc -l
вы можете избежать -n 1
:
cat FILE | wc -l | xargs bash -c 'echo $(($0 + 2))'
Для того, что вам нужно, может быть более подходящим для удаления в интерактивном режиме (-i
) файлы старше, например, 20 дней.
find ~/Pictures/ -type f -name "Screenshot*" -mtime +20 -exec rm -i {} +
Чтобы получить первые 3 новейших файла с этим шаблоном имени, проще:
ls -lt ~/Pictures/Screenshot* | head -n 3
Принятие ФАЙЛА является файлом, который расположен в текущем каталоге:
echo $((`wc -l < FILE`+2))
wc -l < FILE
возвращает количество строк в ФАЙЛЕ и echo $((`wc -l < FILE` +2))
возвращает количество строк в ФАЙЛЕ + 2.
Перевод строки в числовое выражение является относительно простым использующим арифметическим расширением формы $((EXPRESSION))
где EXPRESSION
арифметическое выражение.