巡回スクリプトへの入力引数として提供されたディレクトリc
から始めて、ディレクトリ構造を巡回するシェルスクリプトを作成したいと思います。c
- 巡回中に訪問した各ディレクトリを画面に印刷したいと思います。
- ディレクトリに加えて、サブディレクトリ、ファイルリスト、サイズも印刷したいと思います。
- 1KBを超えるファイルは印刷する必要があります。
現在ディレクトリにあるファイルだけを一覧表示できますが、繰り返すことはできません。
これにより、サイズと権限を含む私のサンプルディレクトリのすべてのファイルが印刷されます。特定のディレクトリだけでなく、すべてのフォルダのディレクトリ、サブディレクトリ、およびファイルを印刷するためのディレクトリを入力として使用したいので、これは私が望むものではありません。
#!/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
シェルは最善の選択ではありません。そして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
) - (1024KiBより大きい(
-type f
)および()ファイルの選択())-a
-size +1024k
-printf
バイト単位のファイルサイズ、ファイルパス、および改行()の%s %p\n
フォーマットされた印刷()
括弧はグループ化に使用されますが、シェルで解釈されないようにバックスラッシュにエスケープする必要があります。
詳細な説明は にありますman find
。
これにより、正確に1024kではなく1024kより大きいファイルが印刷されます。