特定の範囲で番号付けされたファイルをリストする


16

次の番号のディレクトリに一連のファイルがあります。

file1.txt
file2.txt
...
file30.txt
...

次に、特定の範囲のファイルでコマンドを実行したいと思います。たとえば、18〜31です。

これまでのところ、次の方法を使用しました。

3つの引数

command file1[8-9].txt file2[0-9].txt file3[0-1].txt

今、私は他のすべての番号が必要だと仮定し、

ループ

for i in `jot - 18 31 2`; do echo file${i}.txt; done | xargs command

これはより信頼性の高いループのようです(スペースは機能します)

for i in `jot - 18 31 2`; do echo "\"file${i}.txt\" "; done | xargs command

しかし、これを行うにはもっと簡単な方法があるはずです。最善の解決策は、一連のファイルをコマンドラインに返すbash関数を作成することだと思います。それから私は次のようなことができました、

command `filerange file 18 31`

これを効率的に行うためのより良い方法や提案はありますか?

この同じ質問に答えられなかった場合は、ウェブまたはのどこかで事前に謝罪しsuperuserます。


forxargsを使用してファイル名にスペースを許可するループを使用したソリューションを含めるように質問を更新しました。bash 4がなくても機能するようです。bash4があれば、間違いなくブレース拡張を使用してください! 選択した回答をご覧ください。 Snow Leopard bashをアップグレードするための恥知らずなプラグ
ミルキーポストマン

回答:


25

これを試して:

for file in file{18..31}.txt

これは「シーケンス式」として知られており、Bashのブレース拡張機能の一部です。Bash 3および4で動作します。

増分機能はBash 4の新機能です。おそらくBash 3.xがあります。

Bash 4では、次のことができます。

$ for i in {1..6..2}; do echo $i; done
1
3
5

ただし、Bash 3では、同じ結果を得るためにこれを行う必要があります。

$ for ((i=1; i<=6; i+=2)); do echo $i; done

1ずつ増加する同じフォーム:

$ for ((i=1; i<=6; i++)); do echo $i; done

任意の数値を変数または式にすることができます。ただし、シーケンス式では、数値は定数でなければなりません

ファイルでそのフォームを使用する例を次に示します。

for ((i=18; i<=31; i++))
do
    echo "file${i}.txt"
done

Bash 4のシーケンス式のもう1つの新機能は、先行ゼロを含める機能です。これは、適切にソートできる番号付きファイルを作成(および使用)する場合に便利です。

Bash 4の場合:

touch file{001..010}.txt

「file001.txt」から「file010.txt」という名前のファイルを作成します。それらの名前は予想される順序でソートされます。先行ゼロがないと、「file10.txt」は「file1.txt」の前にソートされます。

ファイルを操作するには、同じ先行ゼロ構文を使用できます。

for file in file{001..010}.txt; do echo "$file"; done

Bash 3では、先行ゼロが必要な場合、自分で値を埋め込む必要があります。

for i in {1..10}
do
    printf -v i '%03d' $i 
    echo "file${i}.txt"
done

このprintfステートメントは、幅が3になるように、iの値の先頭にゼロを追加します(「4」は「004」になります)。

編集:

ファイル名にスペースを含めるのは簡単です:

$ touch "space name "{008..018..3}" more spaces"
$ ls -l sp*
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000008 more spaces
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000011 more spaces
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000014 more spaces
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000017 more spaces
$ for f in "space name "{008..018..3}" more spaces"; do mv "$f" "${f}.txt"; done
$ ls -l sp*
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000008 more spaces.txt
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000011 more spaces.txt
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000014 more spaces.txt
-rw-r--r-- 1 user group 0 2011-01-22 11:48 space name 000017 more spaces.txt

ありがとうございました!これが私の生涯であった場所がわかりません。私が動作することができないことの1つは、増分がOSXバージョンのbashでは動作しないようだということです。つまり、{1..10..2}OSX bashで作業できません。
ミルキーポストマン

まあ、それはSnow Leopardが(何らかの理由で)bash 3.1を使用しているからです。これはソフトウェアの問題です。
ミルキーポストマン

@milkypostman:増分機能と先行ゼロ{01..10}はBash 4の新機能です。おそらくBash 3.xがあります。インクリメント機能が必要な場合、または範囲の境界に変数を使用する場合は、次の形式を使用しますfor ((i=1; i<=10; i+=2}(またはi++1ずつインクリメントするため)。任意の数値を変数または式にすることができます。次に、forループ内で値を使用するには、echo "file${i}.txt". In Bash 3, if you need leading zeros, inside the for loop do: printf -vi '%03d' $ i` を使用します。iこれにより、幅が3になるように値の先頭にゼロが追加されます(たとえば、 "4"は "004"になります)。
追って通知があるまで一時停止します。

デニス、ソリューションを更新して代替フォームを含める方法はありますか。コメントであることは、おそらく私がおそらく得ようとしているものを難読化している。
ミルキーポストマン

@milkypostman:編集した回答をご覧ください。
追って通知があるまで一時停止します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.