2016-03-25 10 views
1

ディレクトリ内のすべてのファイルの拡張子を見つける必要があります(同じ拡張子が2つある場合はその1つだけです)。私はすでにそれを持っています。しかし、私のスクリプトの出力は次のようになりますSHELL印刷がちょうど良い部分です。 (DOT)

test.txt 
test2.txt 
hello.iso 
bay.fds 
hellllu.pdf 

私はgrep -e -e 'を使っています。 そして、これらの拡張機能は、txt、iso、fds、pdfのような1つの変数に与える必要があります

助けることができる人はいますか?私はすでにそれを持っていたが、私はそれをアレイ上に持っていた。今日私はそれがダッシュでも働かなければならないことを知った。

答えて

0

ls ..を置き換える:

find . -type f -name '?*.?*' -print0 | 
awk -F. -v RS='\0' '!seen[$NF]++{print $NF}' 
+0

こんにちは。このコードは動作しますが、例外が1つあります。たとえば、text.txt some.iso hw.pdf .hellou(ここでhellouはファイルを隠しています)のようなdir(およびsubdirs) "その例外をリストから除いているのだろうか?"だから、exteptionsはちょうど.txt、.iso、および.pdfになるだろうか? – Johnczek

0

は、同様にfindで行うことができますが、私は、これはあなたがユニークな拡張子のカンマ区切りリストを割り当てたい場合は、あなたがこの

ext=$(for f in *.*; do echo "${f##*.}"; done | sort -u | paste -sd,) 

echo $ext 

csv,pdf,txt 

に従うことができます

for f in *.*; do echo "${f##*.}"; done | sort -u 

より簡単だと思います代わりに ls

ls -1 *.* | rev | cut -d. -f1 | rev | sort -u | paste -sd, 

rev/revが必要ですファイル名に複数のドットがある場合、拡張子が最後のドットの後ろであると仮定します。他のディレクトリの場合は、すべてのスクリプトで部分*.*dirpath/*.*に変更するだけです。

あなたのご意見が分かりません。変数に代入しないと、デフォルトで出力に出力されます。スクリプトに変数としてディレクトリ名を渡したい場合は、あなたが持つサブディレクトリを持っている場合には、スクリプト

#!/bin/bash 
# print unique extension in the directory passed as an argument, i.e. 

ls -1 "$1"/*.* ... 

にあなたの最初の引数になると仮定すると、$ 1をDIRPATHをスクリプトファイルにコードを入れて置き換えますスクリプト上記の拡張子は、ファイルタイプのみに制限し、同様にそれらを含めすべての独特の拡張子を取得するためにawkfindを使用することができます

find . -maxdepth 1 -type f -name "*.*" | ... 
+0

これはうまく動作しますが、現在のdirでのみです:/もし私が変数の中に出力を保存していれば(上のコードリンクのコードリンクにあります)、どのようにサイクルのためにアセンブルしていますか? printfのように "mains"と呼んでいます。 "拡張子:%s" "関数の出力" – Johnczek

+1

'ls -1'は' printf '%s \ n' *。* 'しかし、これは改行を含んでいるファイル名で壊れてしまいます。 –

+0

もう1つだけです。例えばdirとかsomething.dirsomethingと呼ぶと、スクリプトはファイル拡張子のように.dirsomethingを取るでしょう。ありがとうございました。 – Johnczek