私はbashとコーディングの初心者ですのでご了承ください。ファイルリスト(> 1000)があり、それを別の形式に変換する必要があります。ただし、一度に40個のファイルに対してこのコマンドを実行する必要があります。
私が試したことは次のとおりです。
path=/home/dir1/dir2/dir3;
ls ${path} >> ${path}/LIST;
FILES=${path}/LIST;
xargs -n 40 <<$FILES | xargs commandname
ベストアンサー1
問題はリストを読むことです。
FILES=${path}/LIST;
しなければならない
FILES=$(<"${path}/LIST")
しかし、
xargs
ファイルを直接読むこともできますxargs -a "${path}/LIST"
。xargs
まったく繰り返す必要はありません。- ファイル名変数は常に二重引用符で囲む必要があります!
- パスにスペースや改行文字が含まれていると、スクリプトに多くの問題が発生します。
- ファイルが見つからない場合は、引数なしでコマンドを実行できないように追加されました
-r
。xargs
それでも、
代わりに配列を使用する必要があります。
また、ファイル名の一部として改行文字に関連する問題を回避するため\0
に、区切り文字とを一緒に使用することに慣れることをお勧めします。xargs -0
shopt -s nullglob # avoid `*` as file if no files found in $path
path=/home/dir1/dir2/dir3
files=("${path}"/*)
printf '%s\0' "${files[@]}" | xargs -0 -r -n40 commandname
shopt -u nullglob
またはparallel
代わりに使用してくださいxargs
:
shopt -s nullglob
parallel -j1 -n40 commandname ::: /home/dir1/dir2/dir3/*