Как я могу передать результат по каналу команды туалета в арифметическое расширение?

Я хочу работать 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 и затем просто удаляют их

2
задан 15 January 2020 в 22:09

2 ответа

Что вы спрашиваете (источник):

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
2
ответ дан 15 January 2020 в 19:58

Принятие ФАЙЛА является файлом, который расположен в текущем каталоге:

echo $((`wc -l < FILE`+2))  

wc -l < FILE возвращает количество строк в ФАЙЛЕ и echo $((&grave;wc -l < FILE&grave; +2)) возвращает количество строк в ФАЙЛЕ + 2.

Перевод строки в числовое выражение является относительно простым использующим арифметическим расширением формы $((EXPRESSION)) где EXPRESSION арифметическое выражение.

1
ответ дан 15 January 2020 в 22:19

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

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