AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题

问题[stat](unix)

Martin Hope
thb
Asked: 2019-12-01 04:59:44 +0800 CST

如何使用 stat 或 bash 来检查 FILENAME 是否引用文件

  • 3

该stat命令是否提供或确实bash提供了一种简单的方法来检查是否FILENAME引用文件而不是目录?

使用bashand stat,这是我丑陋的解决方案:

if RESPONSE="$(LC_ALL=C stat -c%F FILENAME)"\
 && [ "$RESPONSE" = 'regular file'\
 -o "$RESPONSE" = 'regular empty file' ]
then
    # do something ...
fi

另请参阅此相关问题。

files stat
  • 2 个回答
  • 1337 Views
Martin Hope
finefoot
Asked: 2019-07-14 07:31:45 +0800 CST

从`stat`获取以毫秒为单位的mtime Epoch时间戳

  • 5

如果我stat用来显示 mtime,我会得到一个以毫秒为单位的日期:

$ stat -c '%y' test.log 
2019-07-04 14:32:10.730059167 +0200

但是,如果我想显示 Epoch 时间戳,我将不再获得毫秒数:

$ stat -c '%Y' test.log 
1562243530

我是否遗漏了一些东西,或者我必须从两个输出中将它修补在一起?

timestamps stat
  • 1 个回答
  • 6122 Views
Martin Hope
Dan
Asked: 2019-06-21 04:38:59 +0800 CST

链接 find exec 和 while 循环

  • 0

我正在尝试堆叠一个查找命令,以便它返回的结果仅包含其中包含“警告:”或“错误:”文本的文件。我还需要特定格式的这些结果,所以我正在使用exec stat它。

我可以得到这个版本的工作,但我需要能够-exec stat在 while 循环中使用来制定一个特定的字符串,这-exec stat让我的 shell 把>提示交给我。不工作的部分在下面以粗体显示。

另外,我可以让这些工作。我不能在一起。

这是我工作的一个例子:

find . -type f -exec grep -li error: {} \; | while read -r file; do ls -l "$file"; done

所以现在我正试图用另一个将文件限制为特定时间、类型等的进程来硬塞它。进展不顺利:

查找 /my/directory/here/ -type f -name *.log -mmin -480 -mmin +60 -exec grep -li 警告:{} \; -exec grep -li 错误:{} \; | 同时读取-r文件;执行 -exec stat -c "$file" '%n|%y|%x|%s|%U|%u' {} \; 完毕

-exec stat请注意,如果我从 while 循环中删除 ,整个事情都会起作用。如果我用简单的 替换它ls -l,结果会返回给我。现在 shell 只是给我一个命令提示符。

我知道我做的不对,但我现在不知道我应该首先解决什么。

find stat
  • 2 个回答
  • 525 Views
Martin Hope
liori
Asked: 2019-05-27 06:36:35 +0800 CST

为什么 st_blocks 总是以 512 字节的块报告?

  • 3

我正在调试一个 fuse 文件系统,它报告了错误的du. 事实证明,它正在将st_size / st_blksize[*] 放入结构中st_blocks。statLinux手册页stat(2)说:

struct stat {
    …
    off_t     st_size;    /* total size, in bytes */
    blksize_t st_blksize; /* blocksize for file system I/O */
    blkcnt_t  st_blocks;  /* number of 512B blocks allocated */
    …
};

st_blksize无论如何,如果在 512B 块中是什么意思st_blocks?

[*] 无论如何看起来都是错误的,因为整数除法不考虑小数部分......

stat api
  • 1 个回答
  • 2054 Views
Martin Hope
humanityANDpeace
Asked: 2018-10-17 10:09:07 +0800 CST

在命令之前 bash stat() 和 access() 很多是正常的吗?

  • 6

在指示运行的 shell 上运行提供strace此输出,该输出在执行实际二进制文件之前显示大量统计信息:bashmkdirmkdir

BASH$> strace -f sh -c "bash -c \"mkdir /tmp\" 2>&1 | nl | grep -e "execve\|stat\|access" 
[.....]
  2766  [pid 17371] stat(".", {st_mode=S_IFDIR|0750, st_size=17262, ...}) = 0
  2767  [pid 17371] stat("/usr/local/sbin/mkdir", 0x7ffd87aad0a0) = -1 ENOENT      2767 (No such file or directory)
  2768  [pid 17371] stat("/usr/local/bin/mkdir", 0x7ffd87aad0a0) = -1 ENOENT (No such file or directory)
  2769  [pid 17371] stat("/usr/bin/mkdir", {st_mode=S_IFREG|0755, st_size=51136, ...}) = 0
  2770  [pid 17371] stat("/usr/bin/mkdir", {st_mode=S_IFREG|0755, st_size=51136, ...}) = 0
  2771  [pid 17371] access("/usr/bin/mkdir", X_OK) = 0
  2772  [pid 17371] stat("/usr/bin/mkdir", {st_mode=S_IFREG|0755, st_size=51136, ...}) = 0
  2773  [pid 17371] access("/usr/bin/mkdir", R_OK) = 0
  2774  [pid 17371] stat("/usr/bin/mkdir", {st_mode=S_IFREG|0755, st_size=51136, ...}) = 0
  2775  [pid 17371] stat("/usr/bin/mkdir", {st_mode=S_IFREG|0755, st_size=51136, ...}) = 0
  2776  [pid 17371] access("/usr/bin/mkdir", X_OK) = 0
  2777  [pid 17371] stat("/usr/bin/mkdir", {st_mode=S_IFREG|0755, st_size=51136, ...}) = 0
  2778  [pid 17371] access("/usr/bin/mkdir", R_OK) = 0
  2779  [pid 17371] execve("/usr/bin/mkdir", ["mkdir", "/tmp"], 0x557ec7e15920 /* 5 vars */) = 0

我的问题是:是否正常(如果是,是什么原因)被/usr/bin/mkdir stat()大量使用?输出行已编号,特别是我想知道 line 2776make once2771已经运行有什么意义。此外,我的印象是 bash 可以保存从2770开始到最终execve的所有系统调用,因为它stat应该立即提供信息?我错过了什么?

从那以后,我一直在寻求解释并检查了 shell 的替代 shell 的dash行为方式它也显示了一些stat()ing :

DASH$> strace -f sh -c "dash -c \"mkdir /tmp\" 2>&1 | nl | grep -e "execve\|stat\|access" 
[....]
  2792  [pid 17372] stat("/usr/local/sbin/mkdir", 0x7ffc66010b50) = -1 ENOENT (No such file or directory)
  2793  [pid 17372] stat("/usr/local/bin/mkdir", 0x7ffc66010b50) = -1 ENOENT (No such file or directory)
  2794  [pid 17372] stat("/usr/sbin/mkdir", {st_mode=S_IFREG|0755, st_size=51136, ...}) = 0
  2795  [pid 17372] execve("/usr/sbin/mkdir", ["mkdir", "/run"], 0x55d8d3453bb8 /* 6 vars */) = 0

我知道行2792,2793类似于行27672768 are because of searching the executable in the various directories in the currentPATH`。

如果打折,那么dash只做一个统计,bash做 10 个。再次提出问题:这正常吗?

更新:在 bash 统计中 有更多geteuid(), getguid(),getuid()和getgid()混杂

BASH$>strace -f sh -c "bash -c \"mkdir /tmp\"" 2>&1 | grep -e "execve\|stat\|access\|geteuid\|getegid\|getuid\|getgid" 
[....]
[pid 24534] stat("/usr/local/bin/mkdir", 0x7fffda480f30) = -1 ENOENT (No such file or directory)
[pid 24534] stat("/usr/local/sbin/mkdir", 0x7fffda480f30) = -1 ENOENT (No such file or directory)
[pid 24534] stat("/usr/bin/mkdir", {st_mode=S_IFREG|0755, st_size=51136, ...}) = 0
[pid 24534] stat("/usr/bin/mkdir", {st_mode=S_IFREG|0755, st_size=51136, ...}) = 0
[pid 24534] geteuid()                   = 1000
[pid 24534] getegid()                   = 1000
[pid 24534] getuid()                    = 1000
[pid 24534] getgid()                    = 1000
[pid 24534] access("/usr/bin/mkdir", X_OK) = 0
[pid 24534] stat("/usr/bin/mkdir", {st_mode=S_IFREG|0755, st_size=51136, ...}) = 0
[pid 24534] geteuid()                   = 1000
[pid 24534] getegid()                   = 1000
[pid 24534] getuid()                    = 1000
[pid 24534] getgid()                    = 1000
[pid 24534] access("/usr/bin/mkdir", R_OK) = 0
[pid 24534] stat("/usr/bin/mkdir", {st_mode=S_IFREG|0755, st_size=51136, ...}) = 0
[pid 24534] stat("/usr/bin/mkdir", {st_mode=S_IFREG|0755, st_size=51136, ...}) = 0
[pid 24534] geteuid()                   = 1000
[pid 24534] getegid()                   = 1000
[pid 24534] getuid()                    = 1000
[pid 24534] getgid()                    = 1000
[pid 24534] access("/usr/bin/mkdir", X_OK) = 0
[pid 24534] stat("/usr/bin/mkdir", {st_mode=S_IFREG|0755, st_size=51136, ...}) = 0
[pid 24534] geteuid()                   = 1000
[pid 24534] getegid()                   = 1000
[pid 24534] getuid()                    = 1000
[pid 24534] getgid()                    = 1000
[pid 24534] access("/usr/bin/mkdir", R_OK) = 0
[pid 24534] execve("/usr/bin/mkdir", ["mkdir", "/tmp"], 0x55adcd4dc040 /* 55 vars */) = 0

所以也许这可以为 bash 的“这里发生的事情”提供线索?是否正在做一些检查以防止setuid漏洞利用?

**更新 2:** geteuid()、getguid()、getuid()和getgid()access 组合似乎是 using库函数glibc的标志。int eaccess(const char *pathname, int mode);每次使用 都会eaccess导致使用 all geteuid、getguid、和getuid,因为 bash 运行findcmd.c的函数,而该函数又像这样运行 eaccess 两次。getgidaccessfile_status

#if defined (HAVE_EACCESS)
  /* Use eaccess(2) if we have it to take things like ACLs and other
     file access mechanisms into account.  eaccess uses the effective
     user and group IDs, not the real ones.  We could use sh_eaccess,
     but we don't want any special treatment for /dev/fd. */
  if (eaccess (name, X_OK) == 0)
    r |= FS_EXECABLE;
  if (eaccess (name, R_OK) == 0)
    r |= FS_READABLE;

其中每个 eaccess 可能链接到 4 个系统调用。

bash stat
  • 2 个回答
  • 295 Views
Martin Hope
sourcejedi
Asked: 2018-08-19 07:03:09 +0800 CST

f_bsize 可以用来做什么?(它类似于 st_blksize 吗?)

  • 0

stat()在文件上,返回几个字段,包括st_blksize. 这被记录为“高效文件系统 I/O 的‘首选’块大小”。该值不用作其他stat()字段的单位,或在 POSIX 标准中的其他任何地方引用。

statvfs()在文件上,返回几个字段,包括f_bsize. 它也返回f_frsize。 f_frsize是f_blocks、f_bfree和的单位f_bavail。 f_frsize被不同地称为“基本文件系统块大小”和“片段大小”。

我的手册页statvfs描述f_bsize为文件系统的块大小。这基本上什么也没告诉我。介绍已经告诉我 statvfs() 返回有关整个文件系统的信息。

  1. 可以f_bsize用来做什么?如果文件系统块大小不等于“基本文件系统块大小”,它是什么意思?

  2. 与Linux 和 BSD 和/或 UNIX 上f_bsize的一样吗?st_blksize让我们忽略 FUSE 文件系统的可能性,其唯一原因是违反此规则。NFS 服务器也是如此。我也不太关心它f_bsize代表文件系统范围的值,它可能会被特定文件覆盖。

  3. 我是否认为与 POSIX 不同st_blksize,POSIX 没有任何特定含义f_bsize?

stat
  • 1 个回答
  • 1463 Views
Martin Hope
Tim
Asked: 2018-06-15 14:23:49 +0800 CST

如何找到目录下最大的三个文件?[复制]

  • 0
这个问题在这里已经有了答案:
根据大小递归排序文件 (11 个答案)
4年前关闭。

https://unix.stackexchange.com/a/240424/674显示了一种在目录下查找三个最近更改的文件(直接或间接)的方法。

find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | awk 'NR==1,NR==3 {print $2}'

我尝试通过替换stat -c '%Y %n'为stat -c '%B %n'. 但它似乎无法正常工作。因为:

 %b - Number of blocks allocated (see ‘%B’)
 %B - The size in bytes of each block reported by ‘%b’

我的猜测是它%b没有报告文件的大小,但我不确定。

那我该怎么办?

files stat
  • 1 个回答
  • 110 Views
Martin Hope
AbstProcDo
Asked: 2018-04-13 00:02:44 +0800 CST

BSD 的 stat 选项相当于 GNU 中的 `%y`

  • 1

有一个选项%y说明上次修改时间 %y 上次数据修改时间,可读

BSD 的 stat 可以将详细信息列为

    $ stat -x Foo
      File: "Foo"
      Size: 96           FileType: Directory
      Mode: (0755/drwxr-xr-x)         Uid: (  501/   me)  Gid: (   20/   staff)
    Device: 1,4   Inode: 8605007622    Links: 3
    Access: Thu Apr 12 10:28:45 2018
    Modify: Thu Mar 22 09:44:46 2018
    Change: Thu Mar 22 09:44:46 2018

%yBSD 中的等价物是什么stat?

bsd stat
  • 1 个回答
  • 251 Views
Martin Hope
sleblanc
Asked: 2018-04-08 19:51:43 +0800 CST

什么是“奇怪的文件”?

  • 38

我正在使用的应用程序不会以此用户消息开头:[Errno 13] Permission denied: '/home/sleblanc/.config/app/.config

当我使用ls时,文件显示如下:

?--------- 1 root root     0 Dec 31  1969 .config

在文件上运行 stat 给了我这个:

% stat .config
  File: .config
  Size: 0           Blocks: 0          IO Block: 4096   weird file
Device: 2dh/45d Inode: 9799944     Links: 1
Access: (0666/?rw-rw-rw-)  Uid: ( 1000/     sleblanc)   Gid: ( 1000/         sleblanc)
Access: 1969-12-31 19:00:00.000000000 -0500
Modify: 1969-12-31 19:00:00.000000000 -0500
Change: 2018-04-07 23:40:22.549653691 -0400

最令人惊讶的是提到了一个“奇怪的文件”。

什么是奇怪的文件?

filesystems stat
  • 1 个回答
  • 3198 Views
Martin Hope
again
Asked: 2018-03-09 03:33:56 +0800 CST

创建时间异常

  • 1

我需要知道文件的创建时间。我试图运行该stat filename命令。但是我的 fs 不会将文件创建时间存储为元数据。

[root@s1 XYZ]# stat ./px/cd/78/cd78eholuefekgpz6c0snn5oaayypnloqxgfivszd5d.mxp
  File: `./px/cd/78/cd78eholuefekgpz6c0snn5oaayypnloqxgfivszd5d.mxp'
  Size: 16241           Blocks: 32         IO Block: 4096   regular file
Device: fd02h/64770d    Inode: 129108489   Links: 1
Access: (0644/-rw-r--r--)  Uid: (  509/ UNKNOWN)   Gid: (  509/ UNKNOWN)
Access: 2018-03-07 12:28:31.000000000 +0200
Modify: 2018-03-07 07:04:15.000000000 +0200
Change: 2018-03-07 12:28:31.468075157 +0200

但是,我阅读了这个站点并使用了 debugfs 命令。它显示 crtime(创建时间)。但是显示的创建时间大于(更新)修改时间。怎么了?

[root@s1 XYZ]# ls -i ./px/cd/78/cd78eholuefekgpz6c0snn5oaayypnloqxgfivszd5d.mxp
129108489 ./px/cd/78/cd78eholuefekgpz6c0snn5oaayypnloqxgfivszd5d.mxp
[root@s1 XYZ]# df -T ./px/cd/78/cd78eholuefekgpz6c0snn5oaayypnloqxgfivszd5d.mxp
Filesystem                Type  1K-blocks       Used Available Use% Mounted on
/dev/mapper/datavg-datalv ext4 5986257120 5645927428  36483732 100% /data
[root@s1 fcs_backup]#  debugfs -R 'stat <129108489>' /dev/mapper/datavg-datalv
debugfs 1.41.12 (17-May-2010)
Inode: 129108489   Type: regular    Mode:  0644   Flags: 0x80000
Generation: 3953510053    Version: 0x00000000:00000001
User:   509   Group:   509   Size: 16241
File ACL: 0    Directory ACL: 0
Links: 1   Blockcount: 32
Fragment:  Address: 0    Number: 0    Size: 0
 ctime: 0x5a9fbecf:6f990a54 -- Wed Mar  7 12:28:31 2018
 atime: 0x5a9fbecf:00000000 -- Wed Mar  7 12:28:31 2018
 mtime: 0x5a9f72cf:00000000 -- Wed Mar  7 07:04:15 2018
crtime: 0x5a9fbecf:6f990a54 -- Wed Mar  7 12:28:31 2018
Size of extra inode fields: 28
EXTENTS:
(0-3): 516503300-516503303

编辑 的文件未打开。我以同样的方式运行。

[root@s1 XYZ]# stat ./px/cd/78/cd78eholuefekgpz6c0snn5oaayypnloqxgfivszd5d.mxp
      File: `./px/cd/78/cd78eholuefekgpz6c0snn5oaayypnloqxgfivszd5d.mxp'
      Size: 16241           Blocks: 32         IO Block: 4096   regular file
    Device: fd02h/64770d    Inode: 129108489   Links: 1
    Access: (0644/-rw-r--r--)  Uid: (  509/ UNKNOWN)   Gid: (  509/ UNKNOWN)
    Access: 2018-03-07 12:28:31.000000000 +0200
    Modify: 2018-03-07 07:04:15.000000000 +0200
    Change: 2018-03-07 12:28:31.468075157 +0200
    [root@s1 XYZ]#  debugfs -R 'stat <129108489>' /dev/mapper/datavg-datalv
    debugfs 1.41.12 (17-May-2010)
    Inode: 129108489   Type: regular    Mode:  0644   Flags: 0x80000
    Generation: 3953510053    Version: 0x00000000:00000001
    User:   509   Group:   509   Size: 16241
    File ACL: 0    Directory ACL: 0
    Links: 1   Blockcount: 32
    Fragment:  Address: 0    Number: 0    Size: 0
     ctime: 0x5a9fbecf:6f990a54 -- Wed Mar  7 12:28:31 2018
     atime: 0x5a9fbecf:00000000 -- Wed Mar  7 12:28:31 2018
     mtime: 0x5a9f72cf:00000000 -- Wed Mar  7 07:04:15 2018
    crtime: 0x5a9fbecf:6f990a54 -- Wed Mar  7 12:28:31 2018
    Size of extra inode fields: 28
    EXTENTS:
    (0-3): 516503300-516503303
    [root@s1 XYZ]# lsof ./px/cd/78/cd78eholuefekgpz6c0snn5oaayypnloqxgfivszd5d.mxp
    [root@s1 XYZ]#
linux stat
  • 2 个回答
  • 274 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve