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

How to list all files in a directory without absolute paths along with their file sizes, while using find

GNU bash,版本 4.4.0
Ubuntu16.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 ,}' > "${tmp_input3}"
^-- SC2012: Use find instead of ls to better handle non-alphanumeric filenames.  

当我使用find命令时,它也是returns绝对路径。示例:

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 ,  }'
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 对它很酷,我就很高兴。

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

这是基本命令,

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([=12=],a,"/"); print " "a[n]}'

输出

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

Shell 检查状态

真正的挑战(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 "" || return
        ls --b l "$@"
}

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

请尝试:

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