ディレクトリリストを「パーティション化」することは可能ですか?たとえば、いくつかのブロックに分割して、各「範囲」で異なるアクションを実行することは可能ですか?
たとえば、別のフォルダ内に次のディレクトリがあるとします。
$ ls test
abc/
def/
hij/
klm/
nop/
qrs/
tuv/
wxy/
zzz/
そして、最初の3つのディレクトリでいくつかのアクションを実行し、次の3つのディレクトリで別のアクションを実行したいと思います。
私の考えでは、ls | nl
(しかし、誰かがそれについて言及する前に、私はls
を解析することを知っています ノーノーです!)
これは明らかに機能しませんが、私が望む私のポイントを示しています:
for dir in `ls | nl`;
do
do-something-with ${dir{1..3}} # Where $dir has taken on some numerical value linked to the folder)
do-something-with ${dir{4..6}}
# And so on...
do-something-with ${dir{n-3..n}}
done
私が実際にこれを行う予定のフォルダーは、任意の順序で処理できます(つまり、最終的な分割は完全に任意です)が、論理的な名前の一貫性はありません。つまり、アルファベット順または数値で適切に整理することはできません。ディレクトリ名自体のキーに基づいています。
承認された回答:
次の間違いのいずれかを行う理由はありません この状況の場合:
- 移植性のないGNU拡張機能(
xargs -0
など)を使用する ) - ファイル名をテキストのストリームとしてのみ解析し、改行を含めることができないふりをします。
これは、それほど問題なく移植可能に処理できます:
set -- */
while [ "$#" -gt 0 ]; do
case "$#" in
1)
my-command "$1"
shift 1
;;
2)
my-command "$1" "$2"
shift 2
;;
*)
my-command "$1" "$2" "$3"
shift 3
;;
esac
done
実際、これは必要以上に冗長ですが、この方法で読み取ることができます。
すべてのディレクトリを正確に3つの異なる処理方法に分割する(ただし、同時に処理する必要はない)別のタイプのパーティショニングの場合は、次のように行うことができます。
x=1
for d in *; do
[ ! -d "$d" ] && continue
case "$x" in
1)
# do stuff with "$d"
;;
2)
# do stuff with "$d"
;;
3)
# do stuff with "$d"
;;
esac
x=$(($x+1))
[ "$x" -eq 4 ] && x=1
done