我想编写一个 shell 脚本,它将从目录开始遍历目录结构c
,其中c
是作为遍历脚本的输入参数给出的。
- 在遍历过程中,我希望将访问过的每个目录打印在屏幕上。
- 除了目录之外,我还希望打印出子目录、文件列表及其大小。
- 大于 1KB 的文件应打印出来。
我只能列出当前目录中的文件,但无法遍历它们。
这打印了我的目录 Sample 中的所有文件,包括大小和权限。这不是我想要的,因为我想使用目录作为输入来打印任何文件夹中的目录、子目录和文件,而不仅仅是在特定目录中。
#!/bin/bash
for Sample in "$/Sample"/*
do
ls -l
#echo "$Sample"
done
#All this did was to print all the directories in my system. This is not what I want
#!/bin/bash
for d in "$dir"/*
do
echo "$d"
done
#What I am working on now but it is giving me syntax errors near done. -d $file #prints out for directory, while -f $file print out files.
#!/bin/bash
dir=$dir
for file in ${dir}/*; do
if [[ -d $file ]]; then
echo "$file:"
if [[ -f $file ]]; then
echo "$file"
fi
done
答案1
bash
不是 shell 的最佳选择。和zsh
:
#! /bin/zsh -
zmodload zsh/stat || exit
(( $# != 0 )) || set .
files=($^argv/**/*(ND/,.LK+1))
(( $#files == 0 )) ||
stat -Ln +size -- $files
这里选择大小严格大于 1KiB(1024 字节)的LK+1
文件(仅带 的常规文件)。.
对于大于 1KB(1000 字节)的文件,请将其替换为L+1000
.
答案2
您的要求可以通过一个find
命令来满足:
$ find path/to/dir \( -type d -o \( -type f -a -size +1024k \) \) -printf '%s %p\n'
这说:
- 选择目录 (
-type d
) - 或者 (
-o
) - ( 选择 (
-type f
) 和 (-a
) 大于 1024KiB (-size +1024k
) 的文件) -printf
对文件大小(以字节为单位)、文件路径和换行符(%s %p\n
)进行格式化打印( )
括号用于分组,但必须用反斜杠转义,以防止它们被 shell 解释。
进一步的解释在man find
.
这将打印大于 1024k 的文件,而不是精确的 1024k。