小编for*_*rin的帖子

每秒精确运行一次循环

我正在运行此循环以每秒检查和打印一些内容。然而,因为计算可能需要几百毫秒,所以打印时间有时会跳过一秒。

有没有办法编写这样一个循环,保证我每秒都能得到打印输出?(当然,前提是循环中的计算需要不到一秒钟:))

while true; do
  TIME=$(date +%H:%M:%S)
  # some calculations which take a few hundred milliseconds
  FOO=...
  BAR=...
  printf '%s  %s  %s\n' $TIME $FOO $BAR
  sleep 1
done
Run Code Online (Sandbox Code Playgroud)

bash sleep timestamps

34
推荐指数
5
解决办法
1万
查看次数

使用 find 删除除某个子目录中的所有文件

我想递归删除文件夹中一段时间​​内未访问的a所有文件,子文件夹中的所有文件除外b

find a \( -name b -prune \) -o -type f -delete
Run Code Online (Sandbox Code Playgroud)

但是,我收到一条错误消息:

find: -delete 操作会自动打开 -depth,但 -prune 在 -depth 生效时什么也不做。如果您想继续,只需明确使用 -depth 选项。

添加-depth会导致b包含所有文件,这绝不能发生。

任何人都知道一种安全的方法来使这项工作?

directory find rm

15
推荐指数
1
解决办法
6484
查看次数

在没有过多通知的情况下从 rsync 中排除符号链接

我想排除的符号链接rsync,但--no-links洪水我的终端使用skipping non-regular file的每一个环节,以重点从其他重要信息rsync

如何排除链接而不会被每个单独的事件纠缠?以下是不可接受的解决方案:

  1. 使用-q选项,因为这屏蔽所有来自输出rsync
  2. 过滤消息 grep
  3. 围绕链接精心修改我的包含文件并不是一个好的选择。

如果这是不可能的(看起来似乎如此):为什么跳过非常规文件如此重要,以至于即使用户已指定要排除它们,也会明确警告用户其中的每一个?我很想把这当作开发人员的问题。

rsync

8
推荐指数
2
解决办法
1万
查看次数

限制谁可以发送到电子邮件地址

我想这样做,只有某些发件人:地址可以发送到运行 Postfix 的 Ubuntu 系统上的电子邮件地址(邮件列表)。

理解手册中的 Postfix 需要很多知识,所以我希望得到一个我可以使用的完整配方。目前这是我所拥有的:

/etc/postfix/main.cf:
smtpd_recipient_restrictions =
  check_recipient_access hash:/etc/postfix/protected_destinations
smtpd_restriction_classes = insiders_only
insiders_only = check_sender_access hash:/etc/postfix/insiders, reject

/etc/postfix/protected_destinations:
protected.list@example.com insiders_only

/etc/postfix/insiders:
allowed.user@example.com OK
another.allowed.user@example.com OK
Run Code Online (Sandbox Code Playgroud)

这给出:

fatal: parameter "smtpd_recipient_restrictions": specify at least one working instance of: check_relay_domains, reject_unauth_destination, reject, defer or defer_if_permit
Run Code Online (Sandbox Code Playgroud)

我愿意接受任何建议。它不必是 Postfix。它可以是 procmail 或任何其他标准解决方案。

注意:收件人是一个邮件列表,因此在系统帐户上没有用户帐户。因此,任何解决方案都必须在没有帐户的情况下工作。

当前邮件列表实现

/etc/postfix/virtual:
protected.list@example.com user1@example.com, user2.example.com, ...
Run Code Online (Sandbox Code Playgroud)

postfix procmail

6
推荐指数
1
解决办法
3533
查看次数

排除使 find 抱怨权限的路径

我需要从磁盘卷生成文件列表。一些目录(根目录下的所有隐藏目录)具有奇怪的权限,导致 find 抱怨。

我尝试排除所有这些路径,但一个目录仍然抱怨:

find . -type f -not -path './.*/*'
find: ./.DocumentRevisions-V100: Permission denied
Run Code Online (Sandbox Code Playgroud)

权限是这样的(由操作系统设置,所以我认为它们不应该被弄乱)。

d--x--x--x root  wheel   .DocumentRevisions-V100
Run Code Online (Sandbox Code Playgroud)

如何更改find语句以有效地省略所有隐藏目录,以免抱怨。(我不想这样做,2>/dev/null因为我想了解其他问题)。

permissions find

6
推荐指数
2
解决办法
2114
查看次数

如何查看哪些 URL 被 Privoxy 阻止

我想查看 Privoxy 阻止了哪些 URL 的日志,但我在任何地方都找不到。

我的配置文件(/usr/local/var/log/privoxy/logfile)中的相关行如下:

confdir /usr/local/etc/privoxy
logdir /usr/local/var/log/privoxy
logfile logfile
Run Code Online (Sandbox Code Playgroud)

日志文件/usr/local/var/log/privoxy/logfile为空。

被阻止的 URL 是否记录在另一个文件中?或者如何打开被阻止 URL 的日志记录?

networking logs privoxy

6
推荐指数
1
解决办法
5904
查看次数

用 shell perl 替换 UTF-8 字符

如何perl从 shell 正确替换 UTF-8 字符?

这些示例使用标准输入,但我也需要一些适用的东西perl ... file

这是我的期望:

$ echo ABCæøåDEF | perl -CS -pe "s/([æøå])/[\\1]/g"
ABC[æ][ø][å]DEF
Run Code Online (Sandbox Code Playgroud)

这就是我得到的:

$ echo ABCæøåDEF | perl -CS -pe "s/([æøå])/[\\1]/g"
ABCæøåDEF
Run Code Online (Sandbox Code Playgroud)

用 ASCII 替换 Unicode 字符可以立即生效:

$ echo ABC123DEF | perl -CS -pe "s/([123])/[\\1]/g"
ABC[1][2][3]DEF
Run Code Online (Sandbox Code Playgroud)

我的环境:

perl 5.18.2
Bash 3.2.57
LC_ALL=en_US.UTF-8
LANG=en_US.UTF-8
Run Code Online (Sandbox Code Playgroud)

perl unicode

6
推荐指数
1
解决办法
1680
查看次数

在没有管道的情况下结合 youtube-dl 和 VLC

youtube-dl -o - <webpage> | vlc -在 VLC 中显示视频。但是,视频是通过管道传输的(通过类似fd://0),这抑制了向前/向后跳跃的可能性。

但是,youtube-dl -j <webpage>列出了包含多个“url”属性的 JSON 数据。如果你这样做了vlc <url>,VLC 现在会显示视频长度,让我们跳转等等,就像我们在播放本地视频一样。

问题:现在,完全可以编写一个提取 URL 的小型 Python 脚本,但是有没有一种简单的方法可以仅使用简单的 Bash(最好是单行)来执行此操作?

注意:youtube-dl -j列出了一系列不同质量的视频流,最好选择质量最高的视频。

vlc json youtube-dl

6
推荐指数
1
解决办法
5989
查看次数

bash循环中ffmpeg的问题

当运行以下命令行将多个 .mkv 文件转换为 .mp4 文件时,事情会出错。就好像脚本试图一次运行所有命令,或者它们以某种方式相互纠缠在一起,并且输出变得混乱。我不知道确切。当我刚刚运行这个时,只有第一个文件被转换。其他时候,我似乎得到了意外或随机的结果。

ls -1 *.mkv | while read f; do ffmpeg -i "$f" -codec copy "${f%.*}.mp4"; done
Run Code Online (Sandbox Code Playgroud)

但是,如果我执行以下操作,事情会按预期进行:

ls -1 *.mkv | while read f; do echo ffmpeg -i \"$f\" -codec copy \"${f%.*}.mp4\"; done > script; bash script
Run Code Online (Sandbox Code Playgroud)

但为什么?它是什么ffmpeg?这不会发生在 bash 循环和除ffmpeg. 我想用一种简单的方法来做,而不需要转义引号、管道到脚本文件等。

bash ffmpeg

5
推荐指数
1
解决办法
3859
查看次数

按空格字符拆分字符串(basename 的奇怪问题)

我需要将输出从ps,这是间隔分开的。

#!/bin/bash

A=$(ps -r -e -o pcpu=,comm= | head -1)
B=${A[0]}
C=${A[1]}
printf '%3s  %s\n' $B $(basename $C)
Run Code Online (Sandbox Code Playgroud)

输出应该是:

 42 bar
Run Code Online (Sandbox Code Playgroud)

相反,我得到:

usage: basename ...
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用,最重要的是,我如何使它起作用?

bash

4
推荐指数
2
解决办法
3411
查看次数