замена процесса на открытие списка файлов с приложением

В crontab :

* * * * * date >> dateFile.txt & sleep 30; date >> dateFile.txt &

Прямо, нет? =)

(Лучше поместить полный ПУТЬ команды дата )

Другое решение:

while true; do date >> dateFile.txt & sleep 30; done

-121--118785-

Это, кажется, сработало для ОП.

gdbserver :2345 ls > /dev/null 2>&1 &

Я думаю, что причина этого в том, что когда программа демонизирована, она закрывает все STDIO 0,1 & 2. Следующим вводом-выводом будет 0. Если программа попытается использовать 0,1 или 2 с такими вещами, как printf или scanf, она будет действовать на неправильный ввод-вывод или закрытый ввод-вывод. Например, если он демон-образный, сокет открывается на 0, если был STDIN, и если принтер называется, он будет записывать в неоткрытый FD, что приведет к аварийному завершению программы.

-121--155828-

Есть также хорошие графические инструменты, чтобы помочь выяснить, что в занимает много места в каталоге.

Мне нравится Filelight , который является частью KDE. Здесь он изучает /var/cache на моем компьютере. Зеленый и желтый цвета относятся к apt , красный - к java , а пурпурный - к pbuilder .

filelight

Внутренние окружности непосредственных подкаталогов и они разбиты на более мелкие части во внешних окружностях. Этот инструмент позволяет легко просматривать и видеть, что занимает много места - не только большие файлы, но и большие коллекции небольших файлов.

0
09.03.2019, 11:08
2 ответа

Если команда принимает несколько файлов в качестве аргументов (а не в качестве содержимого, считываемого по каналу), то должна работать простая подстановка команд:

[script/binary/alias] $(find .)

Альтернативно, если команда принимает только один файл за раз, то цикл for должен выполнить этот трюк:

for file in $(find .); do [script/binary/alias] "$file"; done

В обоих случаях имена файлов, содержащие пробелы, табуляции, новую строку, символы подстановки, вызовут проблемы; цикл while/read справляется с этим:

find . | while IFS= read -r file; do [script/binary/alias] "$file"; done

Имена файлов, содержащих новые строки, все равно будут вызывать проблемы; поиск с 0-раздельным выходом будет решать эти проблемы (здесь предполагается, что bash, zsh, ksh):

find . -print0 | while IFS= read -rd '' file; do [script/binary/alias] "$file"; done

Во всех этих примерах найдем . -тип f может быть более подходящим, если Вы хотите обрабатывать только обычные файлы.

2
28.01.2020, 02:20

Если вы хотите, чтобы псевдонимы раскрывались после xargs , вы можете сделать:

alias xargs='xargs '

Однако обратите внимание, что только первое слово после xargs подлежит раскрытию псевдонима и может иметь неожиданные эффекты, если у вас есть псевдонимы для стандартных команд.

$ alias xargs='xargs ' a='echo test'
$ set -x
$ echo x | xargs a
+ echo x
+ xargs echo test
test x
$ echo x | xargs -r a
+ echo x
+ xargs -r a
xargs: a: No such file or directory

Вы можете назвать свой псевдоним как-нибудь иначе и использовать более разумное поведение по умолчанию для xargs . Например, с GNU xargs :

alias axargs='xargs -r -d "\n" '

Теперь подстановка процесса расширяется до одного аргумента: имени файла, который для <(...) содержит вывод команды ( как прямой эфир).

В выводе find это полезно только для команд, которые принимают в качестве аргумента имя файла, которое, как ожидается, будет содержать список файлов, разделенных новой строкой.

feh является одним из них:

feh -f <(find . -mtime -1 -type f -name '*.jpg')

Это работает, только если имена файлов не содержат символов новой строки.

В реализации GNU xargs есть опция -a для получения списка аргументов из файла и в сочетании с -0 и -print0 (или -exec printf '% s \ 0' {} + ) опция find позволяет надежно передать список имен файлов:

xargs -r0a <(find ... -print0) feh....

Это не хотя помогает решить вашу проблему с псевдонимом.

Теперь, если вы хотите передать вывод команды в качестве аргумента (ов) другой команде, вы должны использовать замену command вместо замены process . Однако остерегайтесь нескольких предостережений.

cmdA "$(cmdB)"

передает вывод cmdB без завершающих символов новой строки в качестве одного аргумента в cmdA .Например, если у вас есть три обычных файла (здесь с необычными, но вполне допустимыми именами): * * / etc / passwd .jpg , foo.txt и (где означает символ новой строки), вывод find. -type f ( cmdB ) будет ./* * / etc / passwd .jpg ./foo.txt ./ < nl> , поэтому cmdA получит один аргумент ./* * / etc / passwd .jpg ./foo.txt ./.

Вероятно, это не то, что вам нужно. Вы бы хотели, чтобы cmdA получал каждое имя файла как отдельные аргументы: ./* * / etc / passwd , ./ foo.txt и ./ .

Итак, по сути, вам нужно разделить вывод find на отдельные имена файлов. В оболочках POSIX есть оператор для этого, оператор split + glob , который неявно вызывается, когда вы оставляете подстановку команды (или расширение параметра или арифметическое раскрытие) без кавычек.

cmdA $(cmdB)

разделит вывод cmdB (без завершающих символов новой строки) на символы $ IFS (по умолчанию пробел, табуляция и новая строка), а затем каждое слово будет подвергаться глобус.

В нашем примере выше это не то, что мы хотим. Это разделит ./* * / etc / passwd .jpg на ./* , * , / etc / passwd и .jpg и те ./* и * будут перенесены в список файлов в текущем каталоге.

Мы хотим разделить символы новой строки, а не делать подстановку. Это сделано с помощью:

IFS='
' # newline only
set -f
cmdA $(cmdB)

Это все еще не работает для имен файлов, содержащих символы новой строки. Вывод find обычно не подлежит последующей обработке, если вы не используете -print0 или вы не можете гарантировать, что в именах файлов не будет символов новой строки.

Теперь только zsh позволяет разбивать на \ 0 символы:

cmdA ${(0)"$(cmdB)"}

разбивает "$ (cmdB)" на последовательности символов NUL. Или:

IFS=$'\0'  # no need for set -f in zsh
cmdA $(cmdB)

Другая проблема с подходами к подстановке команд заключается в том, что если cmdB не работает и / или ничего не выводит, cmdA все равно будет запущен (без аргументов). Этого можно избежать с помощью этого синтаксиса (все еще с zsh ):

cmdA ${$(find...):?no file}

Но если вы используете zsh , вам обычно не нужно отказываться от всех этих проблем, поскольку zsh поддерживает большую часть функций find внутри. Например, вы должны использовать:

myalias ./**/*.jpg(.m-1)

Для отображения файлов jpg , которые были изменены в последний раз за последние 24 часа.

2
28.01.2020, 02:20

Теги

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