2016-09-01 18 views
1

作業ディレクトリにいくつかのファイルがあり、すべてのテキストファイルを印刷したいのですが、問題はWDのディレクトリでもあります。私が入力したときにこれは、意味:Bash:ワイルドカードを使用してファイルとディレクトリを区別する

cat * 

出力は次のとおりです。

9 Tom Grapes 28 
10 Ben Lemon 21 
11 Paul Lime 37 

Next cool file 

cat: yang: Is a directory 
cat: ying: Is a directory 

私はこれらの 'エラー・メッセージ' を削除したいので、私は試してみました:

cat *[!/] 

しかし、それだけで返信:

cat: '*[!/]': No such file or directory 

しかし、もう一方の方法ound:のみ

cat */ 

プリント:

cat: yang: Is a directory 
cat: ying: Is a directory 

これでもファイルがスラッシュで終わるすべてを意味するのでしょうか?はいの場合、ファイルとディレクトリを区別する方法はありますか?そうでない場合、このワイルドカードはなぜ機能しないのですか?

PS:私は、Linux

+3

脇注:あなたはbashのを使用されますが、あなたは、シェルを自由に選択している場合Zshの使用を検討するかもしれません。bashで解決するのが難しいいくつかの問題は、Zshで(時には少し謎めいていますが)簡単です。あなたの場合、Zshコマンドは 'cat *(^ /)'になります。括弧内の表現には「ディレクトリなし」と表示されます。 bashのように、プレーンなファイルがないとエラーになります。この場合、その猫に何も書き込まないようにしたい場合は、 'cat *(N^/)/ dev/null'を実行します。 * N *は次のことを意味します。一致するファイルがない場合は、グロブパターンを空の文字列で置き換えます。 – user1934428

答えて

2

を使用してい*のような任意の式は、ファイル名自体、ないタイプを指します。別の命名規則がない限り(たとえば、ファイルにはすべて拡張子がありますが、ディレクトリは決してありません)、名前に基づいてファイルとディレクトリを区別することは困難です。

末尾の/は名前の一部ではありません。

迅速かつ汚いソリューション:

cat * 2>/dev/null 

このほかには、ちょうどすべてのエラーメッセージを抑制します。 (実際には無効に戻します。)

これを正しく実行したい場合は、これが私の最初のステップになります。それは最良の解決策ではないかもしれませんが、ディレクトリ内のすべてのエントリを調べ、ファイルであるかどうかをチェックし、そのファイルはcatのみです。

1行で記述することができ
for f in *; do 
    if [[ -f $f ]]; then 
     cat $f 
    fi 
done 

for f in *; do if [[ -f $f ]]; then cat $f; fi; done 

は、たぶんここに他の誰かが良いアイデアを持っています。

+0

それは動作しますが、なぜか、とにかく感謝します。私はbashで拡大し、いくつかのノウハウを得たときこの答えに戻ってくると思う。しかし、私の説明したコマンドがうまくいかなかった理由を説明できますか? – Uuser

+0

私の答えを編集して、自分が何をしているかを詳しく説明しました。 – chw21

+0

私はあなたに簡単な例を与えます。私は3つのファイル: 'file1'、 'file2'、 'file3'を持っています。 'file3'を得るために 'cat * [3]'を使うと 'cat * [!3]'を使うことができます。最初のコマンドで 'file3 ' 'file1'と 'file2'が得られます。私の質問に戻る: 'cat * /'はディレクトリだけが参照されているので、エラーを返します。今度は 'not-directories '(= files)のみを参照するように' cat * [!/] 'を使用しますが、これは不思議に動作しません。それが私の主張です。 – Uuser

4
find -maxdepth 1 -type f -exec cat {} + 

編集:

は無視する隠しファイル

find -maxdepth 1 -type f -name '[!.]*' -exec cat {} + 

参考:Exclude hidden files when searching with Unix/Linux find?

+1

もちろん、 'find'を使うことができます。しかし、あなたはナットを裂くためにハンマーを使用していませんか? – chw21

+2

注:これは隠しファイルを見つけます。これはあなたが望むものかもしれませんが、そうでないかもしれません。 – chw21

+1

@ chw21隠しファイルについての良い点は、 '-not -path './.*'' ...を使うと避けることができます。これは 'find'を使ってファイル検索のために作られたコマンドなので、 – Sundeep

関連する問題