2013-02-12 5 views
17

ディレクトリには、さまざまなファイル(.txt.sh)があり、.foo修飾子を付けずにファイルを計画しています。ディレクトリ内の特定のファイルに対するbash〜forループ

あなたはlsディレクトリの場合:

blah.txt 
blah.sh 
blah 
blahs 

私は変更せずに.foo forループのみ使用ファイルに伝えるにはどうすればよいですか?上記の例では、ファイルを「すごくしてください」と言います。

基本的な構文は次のとおりです。

#!/bin/bash 
FILES=/home/shep/Desktop/test/* 

for f in $FILES 
do 
    XYZ functions 
done 

あなたは、これが効果的にディレクトリ内のすべてのものをループ見ることができるように。 .sh.txtまたは他の修飾語句を除外するにはどうすればよいですか?

私はいくつかのif文で遊んでいましたが、それらの変更されていないファイルを選択できるかどうか本当に興味があります。

誰かが.txtのないプレーンテキストファイルの適切な専門用語を教えてもらえますか?

答えて

29
#!/bin/bash 
FILES=/home/shep/Desktop/test/* 

for f in $FILES 
do 
if [[ "$f" != *\.* ]] 
then 
    DO STUFF 
fi 
done 
+0

これは私のために変更された形式で動作します。私のファイル名の中には "。"が含まれているので、* \。*を使ってもそれらを選択することができます。あなたのコードには何が使われていますか?ありがとうございました! –

+1

これはbashのendifです(後方の場合)。 –

+0

ええと、それは 'done'がif文を閉じるために必要なエラーを投げた理由です。クールな感謝。 –

1

マイナスのワイルドカードを使用できますか?それらをフィルタリングする:あなたは、それはもう少し複雑な場合

$ ls -1 
a.txt 
b.txt 
c.png 
d.py 
$ ls -1 !(*.txt) 
c.png 
d.py 
$ ls -1 !(*.txt|*.py) 
c.png 
+0

[OK]を、私はそれらの二つ以上のディレクトリを持っていると言います。 bashに私のためにこれをさせる論理的な方法はありますか?同じ方法で作業しながら、ほとんどのディレクトリに適用できるようにします。 –

+0

@jon_shep:2つ以上のものは? – Blender

+0

ファイル拡張子。あなたの例では、それらを手動で除外しなければなりませんでした。 –

10

することは、あなたは、findコマンドを使用することができます。現在のディレクトリを

for i in `find . -type f -regex \.\\/[A-Za-z0-9]*` 
do 
WHAT U WANT DONE 
done 

説明:

find . -> starts find in the current dir 
-type f -> find only files 
-regex -> use a regular expression 
\.\\/[A-Za-z0-9]* -> thats the expression, this matches all files which starts with ./ 
(because we start in the current dir all files starts with this) and has only chars 
and numbers in the filename. 

http://infofreund.de/bash-loop-through-files/

+0

のようにファイルテストがうまくいっています。私はまだ自分自身でそのコマンドを使用しています –

関連する問題