2010-12-29 8 views
6

私は数十のファイルを持つディレクトリを持っています。私はこのディレクトリから1つおきに何かをしたいと思います。今では私はfindコマンドを使用しますが、これに私はすべてのファイルを処理:bashで1秒ごとにファイルを処理する方法は?

find ./dir/ -type f -exec cat {} \; 
+0

を呼び出すことによって、それを起動するための名前のいずれかの特殊なパターンがあります2番目のファイルですか? – ajreal

+0

@ajreal:これについて考えていました。すべてのファイルは似ていますが、 '_tX.XXXXXXX'で終わります.Xはいくつかの数字です。通常、それらはある範囲、例えば0.1〜2.0であり、最小値から最大値まで幾何学的に成長する。特定の数のファイルはありません。だから私は0.1から2までの10のファイル、または同じ範囲の100のファイルを持つことができます。すべての2番目のファイルに一致する単純なパターンがあるかどうかはわかりません。 – klew

答えて

6
cnt=0; 
for file in $(find ./dir -type f); <-- if not too many matches 
do 
    let cnt=cnt+1; 
    if [ $cnt -eq 2 ]; 
    then echo $file;    <-- do something 
    cnt=0;       <-- alternate file 
    fi; 
done 

または

second_file=$(find -type f | head -2 | tail -1); 
+0

ありがとう、それは動作します。最初の例では、 'cnt = 0'を' if'の中に追加する必要があります.2番目のファイルだけでなく2番目になります。 – klew

0

あなたが別のファイルのそれぞれにmy_cmd実行したい場合は、これは

を助けるかもしれません
find ./dir -type f | sort -n | sed -n '1~2!p' | sed 's/^/mycmd /' | sh 

sedをコピーしました。How to remove every other line with sed?

14
for file in `find dir -type f | awk 'NR % 2 == 0'`; do 
    echo $file 
done 

NRが現在の行番号です。奇数行を取得するには、... == 1を使用します。

+0

これはおそらく、提示されたメソッドの中で最もクリーンです。いい物。 – SaltyNuts

0

私はすべてのファイルを2回持っていたので、すべての2番目のファイルを削除する必要がありました。私はランダムファイルを返したので、ソートを追加しました。それは次のようになります。ファイルにこれを入れ

#!/bin/bash 
DIRNAME="<directoryNameContainingYourFiles>" 
for file in `find $DIRNAME -type f | sort | awk 'NR % 2 == 0'`; do 
    echo "going to modify" $file 
    # ls -laFh $file   # show file details 
    # rm $file     # delete file 
    # mv $file <newDirName> # move file to <newDirName> 
done 

たscriptNameと呼ばれ、

chmod +x scriptName 

を実行し、

./scriptName 
関連する問題