小编Dus*_*yte的帖子

判断文件是否被修改

在 Linux(目前使用 ext4 文件系统)中,如何在读取任何内容的情况下快速检查文件的内容是否已被修改?

stat命令是推荐的方法吗?我目前做

$ stat --format "%Y" hello.txt
Run Code Online (Sandbox Code Playgroud)

稍后我可以检查相同的命令是否产生相同的输出。如果是这样,我的结论是 hello.txt 没有改变。

我的感觉是,人们想要投入更多参数以更加确定。例如,添加文件大小、文件名等是否会提供更好的文件“指纹”?

在这个话题上,我记得我曾经拥有的一个 TrueCrypt 卷总是被我的增量备份程序忽略,可能是因为 TrueCrypt 确保不会留下任何元数据更改。我想确实可以更改由 返回的所有数据stat,因此不能保证对文件的所有可能修改都进行修改?

stat timestamps files

12
推荐指数
1
解决办法
4万
查看次数

如何判断终端会话是否在屏幕内运行

运行 bash 脚本时,我希望能够判断它是否在screen. 这可能吗?

我想要这个,以便.bashrc可以根据会话是否在屏幕内启动来设置命令提示符的颜色。

回答我的问题后发现了此链接:如何判断我是否在屏幕中?

bash gnu-screen bashrc

10
推荐指数
2
解决办法
4351
查看次数

rsync 3.1.0 正在创建空备份目录

我刚刚注意到 rsync 的 3.0.9 和 3.1.0 版本之间存在差异。

运行命令

$ rsync -a --delete --backup --backup-dir=../old source/ dest/

版本 3.1.0 给出输出

Created backup_dir ../old/

即使没有文件被复制到备份目录。我通常将当前时间添加到备份目录名称中,这意味着我最终会得到许多空目录。使用 3.0.9 版 rsync,仅在需要时创建备份目录。

我的问题是:

  1. 这是预期的行为,如果是,是否可以禁止创建空备份目录?
  2. 我可以将 3.0.9 版的 rsync 与 3.1.0 版一起安装,这样一个叫做 rsync309,另一个叫做 rsync310,然后有一个别名将 rsync 链接到两者中的任何一个(在我的情况下,这意味着我会保留使用 rsync 3.0.9,因为我发现这种新行为很烦人)?

rsync

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

ls 输出的非标准排序

我通常在文件名中包含一个日期,以便在我使用ls命令时按时间顺序列出文件和目录,例如2015-08-29_letter_to_santa.txt.

一个缺点是制表符完成受到阻碍。对于上面的例子,如果我想打开给圣诞老人的信,我首先需要知道日期,然后才能快速完成文件名的其余部分。当许多文件名以日期开头时,这很烦人。

我希望能够为文件命名,letter_to_santa.2015-08-29.txt但仍然ls输出按文件名中出现的日期排序的文件。关于如何实现这一目标并同时保留ls产生的彩色输出的任何想法?

为了具体起见,我们假设文件名符合格式basename.date.extension并且.在文件名中恰好使用了两次。

ls sort output

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

从 find 调用函数时的变量范围

在 bash 脚本中,我定义了一个从find. 问题是变量的范围没有扩展到函数。如何从函数访问变量?下面是一个例子:

variable="Filename:"

myfunction() {
    echo $variable $1
}

export -f myfunction

find . -type f -exec bash -c 'myfunction "{}"' \;
Run Code Online (Sandbox Code Playgroud)

这将输出文件名,但没有字符串“文件名:”。

是否有更好的方法来调用函数,find以便为find找到的每个文件调用它,并且仍然定义变量?

bash find function variable

3
推荐指数
1
解决办法
4367
查看次数

将 grep 与包含要扩展的变量的模式一起使用

我在表格上有一个文件

2e95d7582c53583fa8afb54e0fe7a2597c92cbba 1461065389 52880 temp/hello/file.txt
46c897a7aa8a641f46080b3431860bd0cd4a8f05 1461066221 207 temp/Another file.txt
83c8ce6b163ec1c615617fa0dbde9e928bc3daf4 1461056193 86112 Pictures/a photo.jpg
...
Run Code Online (Sandbox Code Playgroud)

也就是说,每一行都有一个 40 个字符长的十六进制数字,后跟空格、整数、空格、整数、空格和可能包含空格的文件路径。每条路径都是独一无二的。

在 bash 脚本中,我有与文件中一行相同形式的变量,只是没有第一个十六进制字符串和空格(前 41 个字符),例如:

myvar="1461066221 207 temp/Another file.txt"
Run Code Online (Sandbox Code Playgroud)

我的目标是在文件中找到忽略前 41 个字符时myvar 完全匹配行。如果找到这样的匹配,我希望将变量line设置为文件中的整行。对于上面的示例,line将设置为

46c897a7aa8a641f46080b3431860bd0cd4a8f05 1461066221 207 temp/Another file.txt
Run Code Online (Sandbox Code Playgroud)

如果没有这样的匹配,line应该设置为空字符串,或者不设置。

我的解决方案是这样的(filelist是文件名):

line=$(grep --color=never -E "^.{41}$myvar$" $filelist)
Run Code Online (Sandbox Code Playgroud)

一个问题是,在$myvar展开时它可能包含特殊符号,如., +, even^$等,这些符号对 具有特殊含义grep。我想grep对一行的前 41 个字符以外的所有字符执行完全匹配myvar …

grep bash shell-script

3
推荐指数
1
解决办法
2477
查看次数

标签 统计

bash ×3

bashrc ×1

files ×1

find ×1

function ×1

gnu-screen ×1

grep ×1

ls ×1

output ×1

rsync ×1

shell-script ×1

sort ×1

stat ×1

timestamps ×1

variable ×1