Bash 根据大小对子目录中的每个文件进行处理
我正在开始编写一个脚本,到目前为止:Bash 根据大小对子目录中的每个文件进行处理,bash,Bash,我正在开始编写一个脚本,到目前为止: #!/bin/bash for d in $(find /home/username/ -maxdepth 1) do if [[ $d == *.txt ]] then echo $d fi done 这将按预期执行,但是我希望它根据文件大小从大到小为我提供文件名。我已经找到了一些半相关问题的答案,并看到了一些东西,比如du和使用find的printf选项,但我还没能把它们
#!/bin/bash
for d in $(find /home/username/ -maxdepth 1)
do
if [[ $d == *.txt ]]
then
echo $d
fi
done
这将按预期执行,但是我希望它根据文件大小从大到小为我提供文件名。我已经找到了一些半相关问题的答案,并看到了一些东西,比如du和使用find的printf选项,但我还没能把它们拼凑在一起 你可以写:
ls -1 -S /home/username/*.txt
其中,-1
标志告诉ls
每行打印一个文件,-S
标志告诉它按大小(从最大到最小)对文件进行排序
这与您的代码之间有一些细微的差别(例如,这不会列出名称以
开头的文件),但我猜这些差别都不在您关心的事情上。(如果是,请详细说明您的要求。)您可以写:
ls -1 -S /home/username/*.txt
其中,-1
标志告诉ls
每行打印一个文件,-S
标志告诉它按大小(从最大到最小)对文件进行排序
这与您的代码之间有一些细微的差别(例如,这不会列出名称以
开头的文件),但我猜这些差别都不在您关心的事情上。(如果是,请详细说明您的要求。)使用stat
命令打印每个文件及其大小,然后通过管道进行排序
stat -f '%z %N' /home/username/*.txt | sort -nr
如果不想在输出中包含尺寸,则可以通过管道连接到切割
:
... | cut -d' ' -f2-
使用
stat
命令打印每个文件及其大小,然后通过管道进行sort
stat -f '%z %N' /home/username/*.txt | sort -nr
如果不想在输出中包含尺寸,则可以通过管道连接到切割
:
... | cut -d' ' -f2-
- 打印每个文件及其大小和文件名
- 第一列的数字排序,即大小
- 移除带有切口的第一个柱
- 将每行读入
变量$line
echo“$line”
- 打印每个文件及其大小和文件名
- 第一列的数字排序,即大小
- 移除带有切口的第一个柱
- 将每行读入
变量$line
echo“$line”
find/home/username/-maxdepth 1-name'*.txt'
,甚至只编写ls-1/home/username/*.txt
,您的代码就可以变得更简单、更安全。请注意,只需编写find/home/username/-maxdepth 1-name'*.txt'
,您的代码就可以变得更简单、更安全,甚至是ls-1/home/username/*.txt
find
都是你更好的建议find
可以组合名称、大小和其他组件,并灵活控制输出,以支持管道中的下一步。即使您不需要递归,也可以避免进一步的过滤。find
如果您不递归,则不需要。丹法瑞尔:为了确保我明白,你是说任何人都不应该使用ls
,因为find
在所有方面都更好?如果是那样的话,我恭敬地表示不同意。你的回答很好,我投你一票。我认为可以公平地说,find
的目的是,并且有很多很好的功能,根据文件的各种属性查找文件,并完全控制格式和结果的输出。我想鼓励人们在给定许多已知条件的情况下,在尝试搜索文件时,不要查看ls
。我想有人举一个例子,用find有效地过滤文件列表,而不需要额外的步骤,正如你所指出的,find
find
是你更好的建议find
可以组合名称、大小和其他组件,并灵活控制输出,以支持管道中的下一步。即使您不需要递归,也可以避免进一步的过滤。find
如果您不递归,则不需要。丹法瑞尔:为了确保我明白,你是说任何人都不应该使用ls
,因为find
在所有方面都更好?如果是那样的话,我恭敬地表示不同意。你的回答很好,我投你一票。我认为可以公平地说,find
的目的是,并且有很多很好的功能,根据文件的各种属性查找文件,并完全控制格式和结果的输出。我想鼓励人们在给定许多已知条件的情况下,在尝试搜索文件时,不要查看ls
。我希望有人提供一个例子,使用find来有效地过滤文件列表,而不需要额外的步骤,正如您所指出的,find
。