2016-09-28 14 views
0

いくつかのファイルを含むディレクトリ「FOO」があるとしますプログラムのNUL出力をbashスクリプトに保存する方法は?

ls foo: 
1.aa 2.bb 3.aa 4.cc 

はbashスクリプトでは今、私は「FOO」内の特定の接尾辞を持つファイルの数、および表示をカウントしますそれら、例えば:

SUFF='aa' 
FILES=`ls -1 *."$SUFF" foo` 
COUNT=`echo $FILES | wc -l` 
echo "$COUNT files have suffix $SUFF, they are: $FILES" 

問題がある:1に等しいもあればSUFF='dd'$COUNT。 googleの後、私が見つけた理由はSUFF='dd'$FILESが空の文字列であり、実際にはプログラムのヌル出力ではなく、wcで1行とみなされます。 NUL出力はパイプを介してのみ渡すことができます。だから、一つの解決策は以下のとおりです。

COUNT=`ls -1 *."$SUFF" foo | wc -l` 

が、これはlsコマンドを2回実行されることにつながります。だから私の質問です:これを達成するためのよりエレガントな方法はありますか?

+0

ファイル名が 'foo'で終わりますか?そのようなサンプル名を1つ与えることはできますか?サブディレクトリでも再帰的に検索しますか? – Inian

+0

fooはディレクトリです。ファイル名は、aa、bb、ccで終わります。サブディレクトリを検索する必要はありません。 – xlwang

答えて

2
$ shopt -s nullglob 
$ FILES=(*) 
$ echo "${#FILES[@]}" 
4 
$ FILES=(*aa) 
$ echo "${#FILES[@]}" 
2 
$ FILES=(*dd) 
$ echo "${#FILES[@]}" 
0 
$ SUFFIX=aa 
$ FILES=(*"$SUFFIX") 
$ echo "${#FILES[@]}" 
2 
$ SUFFIX=dd 
$ FILES=(*"$SUFFIX") 
$ echo "${#FILES[@]}" 
0 
+0

すごい素晴らしい説明! – 123

+3

@ 123:それは面白いです、私は1つ書いていません。あなたは最近眼科医を訪問しましたか? –

+0

FILESの内容を1つずつ出力する簡単な方法はありますか? – xlwang

0

あなただけのファイル数が必要な場合は、私が実際にそのためfindを使用します。それは改行でファイル名を正しく扱うよう

find '/path/to/directory' -mindepth 1 -maxdepth 1 -name '*.aa' -printf '\n' | wc -l 

これは、より信頼性があります。これが動作する方法は、findが一致するファイルごとに1つの空行を出力することです。

編集:あなたは、アレイ内のファイルのリストを保持したい場合は、グロブを使用することができます。

GLOBIGNORE=".:.." 
shopt -s nullglob 
FILES=(*aa) 
COUNT=${#arr[@]} 
echo "$COUNT" 
+0

しかし、後でこれらのファイルの名前をスクリプトに出力したいと思います。 – xlwang

+1

@Inianどういう意味ですか? – redneb

+0

@Inianこれは、ファイル名ごとに改行を出力するだけで、実際のファイル名ではないためです。 – 123

0

あなたもこれを試すことができます。スクリプト内echo $FILESを挿入した場合

#!/bin/bash 
SUFF='aa' 
FILES=`ls -1 *."$SUFF" foo` 
FILENAMES=`echo $FILES | awk -F ':' '{print $2}'` 
COUNT=`echo $FILENAMES | wc -w` 
echo "$COUNT files have suffix $SUFF, they are: $FILENAMES" 

、出力はfoo: 1.aa 2.aa 3.aaそう

awkの-Fである ':' '' {$ 2印刷} $ FILESから1.aa 2.aa 3.aaを取得し、変数

wc -w単語が

をカウントし出力します
0

なぜなら、nullglobオプションはデフォルトでbashで設定解除されているからです。

一致するファイル名が見つからず、シェルオプションnullglobが有効でない場合、その単語は変更されません。 nullglobオプションが設定され、一致するものが見つからない場合、その単語は削除されます。

だから、ちょうどnullglobオプションを設定して、もう一度あなたのコードを実行します。

shopt -s nullglob 
SUFF='aa' 
FILES="$(printf '%s\n' foo/*."$SUFF")" 
COUNT="$(printf '%.0s\n' foo/*."$SUFF" | wc -l)" 
echo "$COUNT files have suffix $SUFF, they are: $FILES" 

またはいっそのこと:

shopt -s nullglob 
suff='aa' 
files=(foo/*."$suff") 
count=${#file[@]} 
echo "$count files have suffix $suff, they are: ${files[@]}" 
+0

Thx。しかし、ファイル名に\ nが含まれていると、失敗する可能性があります。 – xlwang

+0

@xlwang OK、解決済み。 '%.0s \ n'はファイルごとに新しい行だけを出力します。 – sorontar

関連する問題