如何从目录 c 开始遍历目录和子目录,其中 c 作为遍历脚本的输入参数

如何从目录 c 开始遍历目录和子目录,其中 c 作为遍历脚本的输入参数

我想编写一个 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。

相关内容