在 Linux(目前使用 ext4 文件系统)中,如何在不读取任何内容的情况下快速检查文件的内容是否已被修改?
该stat命令是推荐的方法吗?我目前做
$ stat --format "%Y" hello.txt
Run Code Online (Sandbox Code Playgroud)
稍后我可以检查相同的命令是否产生相同的输出。如果是这样,我的结论是 hello.txt 没有改变。
我的感觉是,人们想要投入更多参数以更加确定。例如,添加文件大小、文件名等是否会提供更好的文件“指纹”?
在这个话题上,我记得我曾经拥有的一个 TrueCrypt 卷总是被我的增量备份程序忽略,可能是因为 TrueCrypt 确保不会留下任何元数据更改。我想确实可以更改由 返回的所有数据stat,因此不能保证对文件的所有可能修改都进行修改?
运行 bash 脚本时,我希望能够判断它是否在screen. 这可能吗?
我想要这个,以便.bashrc可以根据会话是否在屏幕内启动来设置命令提示符的颜色。
回答我的问题后发现了此链接:如何判断我是否在屏幕中?
我刚刚注意到 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,仅在需要时创建备份目录。
我的问题是:
我通常在文件名中包含一个日期,以便在我使用ls命令时按时间顺序列出文件和目录,例如2015-08-29_letter_to_santa.txt.
一个缺点是制表符完成受到阻碍。对于上面的例子,如果我想打开给圣诞老人的信,我首先需要知道日期,然后才能快速完成文件名的其余部分。当许多文件名以日期开头时,这很烦人。
我希望能够为文件命名,letter_to_santa.2015-08-29.txt但仍然ls输出按文件名中出现的日期排序的文件。关于如何实现这一目标并同时保留ls产生的彩色输出的任何想法?
为了具体起见,我们假设文件名符合格式basename.date.extension并且.在文件名中恰好使用了两次。
在 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找到的每个文件调用它,并且仍然定义变量?
我在表格上有一个文件
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 …
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