3

これからお見せするよりも少し洗練されたスクリプトを書こうとしていますが、この部分に問題があることはわかっています。

ディレクトリ内のファイルのリストの各名前を、ループを介して変数 (同じ変数を一度に 1 つずつ) に割り当ててから、forこれを使用してループ内で何かを行い、その意味を確認します。

for thing in $(ls $1);
do
    file $thing;
done

編集: この scrypt が Scrypt と呼ばれ、Folder という名前のフォルダーがあり、その中に A、B、C という名前の 3 つのファイルがあるとします。これを書いたときに端末に表示させたい:

./scrypt Folder

以下:

A: file
B: file
C: file

上に示したコードを使用すると、次のようになります。

A: ERROR: cannot open `A' (No such file or directory)
B: ERROR: cannot open `B' (No such file or directory)
C: ERROR: cannot open `C' (No such file or directory)

それが問題だ

4

4 に答える 4

3

1 つの方法はls、たとえば、の代わりにワイルドカード展開を使用することです。

for filename in "$1"/*; do
    command "$filename"
done

$1これは、ファイルが含まれるディレクトリへのパスであると想定しています。

doプレーン ファイルのみを操作する場合は、次の行の直後にチェックを追加します。

[ ! -f "$filename" ] && continue
于 2012-11-22T20:18:20.450 に答える
3

http://mywiki.wooledge.org/ParsingLs

代わりにグロビングを使用します。

for filename in "$1"/* ; do
    <cmd> "$filename"
done

$filename を囲む引用符に注意してください

于 2012-11-22T20:21:01.407 に答える
0

まあ、あなたが意味したのは、ループが目的のディレクトリにファイル名を表示するということだと思います。だから、私はそのようにします:

for filename in "$1"/*; do
echo "file: $filename"
done

そうすれば、結果は次のようになります(ディレクトリに3つのファイルがあり、名前がABCの場合:

`file: A
`file: B
`file: C
于 2014-01-11T21:07:22.937 に答える
0

何を達成しようとしているのかは少し不明ですが、基本的には、既に存在する機能で同じことを行うことができますfind。たとえば、次の例では、フォルダー内で見つかった各ファイルの内容が出力されます。

find FolderName -type f -maxdepth 1 -exec cat {} \;
于 2012-11-22T20:50:01.693 に答える