2

ディレクトリのフォルダーとファイルの名前をリストする必要がありますが、(引数、ユーザーの入力)input1から始まります。input2

#!/bin/bash
START_INDEX=$1
END_INDEX=$2
     for $STA_INDEX in $(ls) -le $END_INDEX; do
           echo item: $STA_INDEX
     done

同僚と一緒に、この「解決策」を思いつきましたが、これはまったく解決策ではありません! だから、誰かが私にこれのどこが間違っているのか説明したり、実用的な解決策への別のアプローチを教えてくれたりできますか. このコードで主なアイデアが得られると思います。

4

3 に答える 3

1

ユーザーが 2 つの名前を指定することが想定されており、これら 2 つの名前の間で並べ替えられるファイルを一覧表示する場合、次のスクリプトがその役割を果たします。

#!/bin/bash

case $# in
(2) : OK;;
(*) echo "Usage: $0 from to" >&2; exit 1;;
esac

lo="$1"
hi="$2"
for file in *
do [[ "$file" < "$lo" ]] && continue
   [[ "$file" > "$hi" ]] && break
   echo "$file"
done

使用が 2 つの引数を提供したcaseかどうかをチェックし、提供されていない場合は半有用なメッセージで救済します。$lo私は単にそれが より低いと仮定し$hiます。そうでない場合は、それらを交換することが可能です。

if [[ "$1" < "$2" ]]
then lo="$1"; hi="$2"
else lo="$2"; hi="$1"
fi

(glob) を使用する*と、ファイル名に含まれるスペース (など) の問題を回避できます。の出力を解析するとls、ファイル名にスペース (など) が含まれているため、エラーが発生しやすくなります。テスト[[では、文字列の辞書式順序付けを行うために使用します。古典的な[テスト演算子は、表記法との整数比較を行い、文字列比較についてはand-ltのみをサポートします。=!=

グロブ内の名前はソートされているため、最初の条件は$loエントリの前にある名前をスキップします。$hiが小さすぎると、他のファイルを処理する必要がなくなります (したがって中断します) 。それ以外の場合は、名前を印刷します。

ループは非常にコンパクトに書かれています。、 、およびを使用するとif、ややコンパクトに書くことができます。elifelse

for file in *
do
    if [[ "$file" < "$lo" ]]
    then continue
    elif [[ "$file" > "$hi" ]]
    then break
    else echo "$file"
    fi
done

ディレクトリのリストが与えられた場合:

cmp.sh        human_numbers.pl  intapprox.pl  lg.c    lu    makefile  x
fibonacci.pl  idsdb00216213.ec  lg            lg.out  lu.c  unget.c   x.c

実行bash cmp.sh garbage rubbishすると以下が生成されます:

human_numbers.pl
idsdb00216213.ec
intapprox.pl
lg
lg.c
lg.out
lu
lu.c
makefile

少し大雑把な質問に対する私の解釈を考えると、それは私が期待するものと一致します。garbageディレクトリ内のファイルの名前でもなくrubbish、それでも機能することに注意してください。

于 2012-10-19T11:03:33.653 に答える
0

このようなもの(基本):

#! /bin/bash

for x in $*
do
  ls -l $x
done


$./args.sh dir1 dir2 ...
于 2012-10-19T11:14:36.833 に答える
0

あなたが話しているインデックスが、ls開始/終了したい出力のインデックスである場合、それは簡単に解決できsedます:

ls | sed -ne "${START_INDEX},${STOP_INDEX}p"

仕組み: からsedの自動出力を抑制し、 range 内のすべての行を出力します<$START_INDEX,$STOP_INDEX>。詳細については、sedマニュアルで範囲演算子を検索してください。

于 2012-10-19T10:59:53.663 に答える