2016-10-26 20 views
2

どのファイル名でも大括弧を逃れるためにいくつかの問題が発生しています。lsの出力で角括弧をエスケープする方法

2つのリストを比較する必要があります。 lsの出力は最初のリストで、2番目の出力はARQ02です。

#!/bin/bash 

exec 3< <(ls /home/lint) 

while read arq <&3; do 
var=`grep -e "$arq" ARQ02` 
    if [ "$?" -ne 0 ] ; then 
    echo "$arq" >> result 
    fi 
done 

exec 3<&- 

私の悪い英語のために申し訳ありません。

+1

「ARQ02」とは何ですか?それは私にファイルのようです。特定のフォルダ内のファイルが別のファイルにリストされているファイルのサブセットであるかどうかを確認するだけですか?このような短いスクリプトには、ここで多くの間違いがあります。 – HuStmpHrrr

答えて

2

あなたの当面の問題は、あなたが-Fオプションを使用して、リテラルではなく、正規表現として検索用語を解釈するgrepを指示しなければならないということです[]のような出力にあるls /home/lintの出力にあるメタキャラクタは、のリテラルのとして扱われ、01を破損しません呼び出し。あなたのコマンドがを合理化することができように、それは-fを使用して、一度grepに渡すために、検索文字列のセットとして直接ls /home/lintからの出力を使用して、このようななどにより、見えます、と述べた

オプション

grep -Ff <(ls /home/lint) ARQ02 > result 

<(...)は、簡単に言えばこれは、いわゆるprocess substitutionです番目を提示しますeコマンドの出力をファイルのように出力します。これは-fとなります。grepの検索語を含むファイルです。


あるいは、場合:

  • ARQ02の線はのみファイル名を含有する完全一致(の一部)ls /home/lintから出力ファイル名、および

  • あなたは気にしないでくださいをソートするか、に格納されているマッチをソートしたい、

HuStmpHrrr's helpful answer考えます。

2

私の解釈は正しいと仮定しなければなりません。それに基づいて、私はオンライナーを簡単に解決することができます。私はここにする必要がある2前提があります:あなたのファイル名は、キャリッジリターンが含まれていないと、あなたは、現代のbashを使用しています。bash <()

comm -23 <(printf "%s\n" * | sort) <(sort ARQ02) 

はファイルとしてSTDOUTをサブシェルとのパイプを発します。 commは、2入力ストリームの差を計算するコマンドです。

comm 
-23 # suppress files unique in ARQ02 and files in common 
<(printf "%s\n" * | # print all the files in local folder with new line breaker 
    sort) # sort them 
<(sort ARQ02) 

それはcommだけインクリメンタルに比較としてソートする必要があります、詳細に説明します。

var=$(grep -Fe "$arq" ARQ02) 

こうすることで、任意の正規表現: