そのためにxargsを使用できます。残念ながら、-I(コマンドラインの途中に挿入)と-L(実行可能ファイルへの1回の呼び出しでファイル数を制限する)を組み合わせることはおそらくできません。したがって、次のコマンドラインを例として作成しました(ただし、ファイル名の特殊文字に注意してください。これらはサポートされていません)。
ls . | \
xargs -n 100 echo | \
(a=1;
while read args; do
echo montage -size 256x256 $args output-$a.png;
a=$((a+1));
done
)
echo
コマンドを本当に実行したい場合は、を削除してください。
警告:
- ファイル名にスペースやその他の特殊文字を含めることはできません
- 最後のモンタージュ行には100個未満のファイルが含まれている可能性があります
更新:
これは対応するforループであり、(私は)ファイル名にスペースが含まれている問題を解決します。
a=0
b=0
lst=
for f in *; do
a=$((a+1))
lst="$lst '$f'"
if test $a -ge 100; then
eval echo montage --args $lst target-$b.png
b=$((b+1))
a=0
lst=
fi
done
アップデート2: Pythonソリューション。ファイル名の特殊文字の影響を受けません。
#!/usr/bin/env python
# iterate.py
"""Usage:
%prog <number per call> <file pattern> <command prefix> -- <command postfix>
e.g. %prog 100 "DSC01*.jpg.svg" montage -size 256x256 -- output-%i.png """
import sys,subprocess,glob,os
if len(sys.argv) < 5:
print __doc__.replace("%prog", os.path.basename(sys.argv[0]))
sys.exit(1)
def chunks(l, n):
for i in xrange(0, len(l), n): yield l[i:i+n]
num, pattern, args = int(sys.argv[1]), sys.argv[2], sys.argv[3:]
files, idx = glob.glob(pattern), args.index("--")
before, after = args[0:idx], args[idx+1:]
for idx,chunk in enumerate(chunks(files,num)):
subprocess.call( before + chunk + [s.replace("%i",str(idx)) for s in after] )
DSC0100.JPG.svg
...DSC2600.JPG.svg
ですか?