如何在使用查找时列出没有绝对路径的目录中的所有文件及其文件大小

Posted

技术标签:

【中文标题】如何在使用查找时列出没有绝对路径的目录中的所有文件及其文件大小【英文标题】:How to list all files in a directory without absolute paths along with their file sizes, while using find 【发布时间】:2020-01-28 12:58:21 【问题描述】:

GNU bash,版本 4.4.0 Ubuntu 16.04

我想列出目录中的所有文件并将它们打印到第二列,同时在第一列中打印文件的大小。例子

1024 test.jpg
1024 test.js
1024 test.css
1024 test.html  

我已经使用ls 命令这样做了,但是 shellcheck 不喜欢它。示例:

In run.sh line 47:
ls "$localFiles" | tail -n +3 | awk ' print $5,$9' > "$tmp_input3"
^-- SC2012: Use find instead of ls to better handle non-alphanumeric filenames.  

当我使用find 命令时,它也会返回绝对路径。示例:

root@me ~ # mkdir -p /home/remove/test/directory
root@me ~ # cd /home/remove/test/directory && truncate -s 1k test.css test.js test.jpg test.html && cd
root@me ~ # find /home/remove/test/directory -type f -exec ls -ld  \; | awk ' print $5, $9 '
1024 /home/remove/test/directory/test.jpg
1024 /home/remove/test/directory/test.js
1024 /home/remove/test/directory/test.css
1024 /home/remove/test/directory/test.html  

实现我的目标最有效的方法是什么。它可以是任何命令,只要 shellcheck 用起来很酷,我很高兴。

【问题讨论】:

看看 GNU find 的 -printf: man find 直到现在我才看到你的指针。我很感激。 【参考方案1】:

请尝试:

find dir -maxdepth 1 -type f -printf "%s %f\n"

【讨论】:

正是我想要的。向你致敬,我的朋友。【参考方案2】:

你可以使用如下所示的东西,

这是基本命令,

vagrant@ubuntu-bionic:~$ find ansible_scripts/ -follow -type f  -exec wc -c  \;

输出,

vagrant@ubuntu-bionic:~$ find ansible_scripts/ -follow -type f  -exec wc -c  \;
59 ansible_scripts/hosts
59 ansible_scripts/main.yml
266 ansible_scripts/roles/role1/tasks/main.yml
30 ansible_scripts/roles/role1/tasks/vars/var3.yaml
4 ansible_scripts/roles/role1/tasks/vars/var2.yaml
37 ansible_scripts/roles/role1/tasks/vars/var1.yaml

上面的命令用来描述我使用 find 命令得到的绝对路径。

下面是更新的命令,您可以使用它来获取大小和文件名,但如果文件名相同,它可能会产生一些歧义。

命令

find ansible_scripts/ -follow -type f  -exec wc -c   \; | awk -F' ' 'n=split($0,a,"/"); print $1" "a[n]'

输出

vagrant@ubuntu-bionic:~$ find ansible_scripts/ -follow -type f  -exec wc -c   \; | awk -F' ' 'n=split($0,a,"/"); print $1" "a[n]'
59 hosts
59 main.yml
266 main.yml
30 var3.yaml
4 var2.yaml
37 var1.yaml

Shell 检查状态

【讨论】:

【参考方案3】:

真正的挑战(shellcheck 突出显示)是处理带有嵌入空格的文件名。由于(旧版本的)ls 使用换行符来分隔不同文件的输出,因此很难处理带有嵌入(或尾随)换行符的文件。

从问题和示例输出中,不清楚如何处理带有换行符的文件。

假设不需要处理带有嵌入换行符的文件名,您可以使用“wc”(带有 -c)。

(cd "$pathToDir" && wc -c *)

值得注意的是(较新版本的) ls 提供了多个选项来处理带有嵌入换行符的文件名(例如 -b)。不幸的是,即使代码正确处理了这种情况,shellcheck 也无法识别并产生相同的错误消息('use find instead ...')。

要获得对带有嵌入换行符的文件的支持,可以利用 ls 引用:

#! /bin/bash
     # Function will 'hide' the error message.
function myls 
        cd "$1" || return
        ls --b l "$@"


     # Short awk script to combine $9, $10, $11, ... into file name
     # Correctly handle file name contain spaces
(myls "$pathToDir") |
    awk ' N=$9 ; for (i=10 ; i<=NF ; i++) N=N + " " $i ; print $5, N '

【讨论】:

拼写检查?你的意思是shellcheck对吗?我只是想仔细检查以确保我们在正确的页面上。

以上是关于如何在使用查找时列出没有绝对路径的目录中的所有文件及其文件大小的主要内容,如果未能解决你的问题,请参考以下文章

MFC怎么查找当前目录以及子目录下的*_DS.TXT文件?

如何使用环境路径查找可能未完全限定的文件?

浅谈nodejs文件操作中的相对路径问题

请教如何获得一个shell文件所在的目录

linux shell 获取文件夹全文绝对路径

Linux基础命令01