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

时间:2019-09-28 14:47:20

标签: bash find shellcheck

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很酷,它就可以是任何命令,我很高兴。

3 个答案:

答案 0 :(得分:1)

您可以使用如下所示的内容,

这是基本命令,

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

外壳检查状态 Online Shell Check status

答案 1 :(得分:1)

请尝试:

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

答案 2 :(得分:0)

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

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

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

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

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

要获得对嵌入换行符的文件的支持,可以使用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 }'