Подсчет файлов между двумя соответствующими строками в нескольких каталогах

Мне удалось найти интересную статью о том, почему нужно было заменить init и чем его заменить. Процитируем: «Процесс инициализации запускается последовательно, т. е. одна задача запускается только после успешного запуска последней задачи и ее загрузки в память. Это часто приводило к задержке и длительному времени загрузки. Однако systemd был разработан не для скорости, а для аккуратное выполнение дел, что, в свою очередь, позволяет избежать всех -необходимых ООН задержек».

Итак, чтобы ответить на мой собственный вопрос, похоже, что systemd заменил init.d по некоторым уважительным причинам, и другие методы, такие как то, что упоминается в комментариях GypsyCosmonaut, заключается в том, чтобы просто иметь сценарий запуска в ~/.config/autostart, который также поставляется с удобным инструментом запуска приложений, если вы используете рабочий стол.

пример init.d


На всякий случай, если кто-то действительно хочет сделать то, что я изначально пытался сделать, вам просто нужна ссылка на каталог /etc/init.d.

Например, если у вас есть файл.jar, который нужно запустить с помощью команд, подобных /etc/init.d/yourProgram startили /etc/init.d/yourProgram stop, вы просто сделаете что-то похожее на:

sudo ln -s /path/to/yourProgram.jar /etc/init.d/yourProgram

Описанный выше метод также работает, если вы укажете ему скрипт, который запускает вашу программу, а не.jar

запуск init.d при загрузке


Если вы хотите, чтобы эта служба запускалась при запуске,использовать:

sudo service yourProgram defaults

Это автоматически заглянет в /etc/init.d/ и найдет вашу ссылку на актуальный скрипт.

2
23.09.2019, 14:38
3 ответа

Вы, конечно, можете использовать find, но также реже updatedbи locate.

Во-первых, нам нужно использовать updatedbдля создания базы данных существующих файлы, которые будут использоваться последующими командами locate. Идти к /home/me/filesи сделать:

updatedb --require-visibility 0 -o locate.db -U.

Теперь мы готовы использовать locateвместе с Bash {a..b}синтаксис для поиска списка файлов. Например:

$ locate -d./locate.db file_{112..125}.txt
./files_11/file_112.txt
./files_11/file_113.txt
./files_12/file_124.txt
./files_12/file_125.txt
$ locate -d./locate.db file_{100..105}.txt
./files_10/file_100.txt
./files_10/file_102.txt
./files_10/file_105.txt
$ locate -d./locate.db file_{103..106}.txt
./files_10/file_105.txt
./files_10/file_106.txt

Чтобы показать только количество найденных файлов, направьте locateвывод через wc -l.

Преимущество этого решения в том, что locateработает очень быстро.

Недостатком является то, что вам придется повторно -создавать базу данных вручную. каждый раз, когда добавляются или переименовываются новые файлы (или, возможно, используетсяinotify)и что locateне может заменить найденные имена файлов на NUL, что привести к тому, что wc -lвернет неверный счетчик в случае файлов, которые имеют новую строку в их именах.

2
27.01.2020, 21:51

Попробуйте это,

 ls /home/test/files/*/file_{112..125}.txt 2> /dev/null | wc -l
3
27.01.2020, 21:51

Если вы хотите подсчитать только пронумерованные файлы от x до y:

$ tree files/
files/
├── file_100.txt
├── file_102.txt
├── file_105.txt
└── file_106.txt

0 directories, 4 files


$ start=103; end=106; echo files/* \
  | grep -o '[[:digit:]]*' \
  | awk '{ if ($1 >='$start' && $1 <= '$end') {++count}} END { print count }'
2

Но если вы действительно уверены, что в ваших именах файлов нет пробелов или разрывов строк, Ответ @msp9011 намного проще...

2
27.01.2020, 21:51

Теги

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