bashパーティションファイルのリストと各グループでコマンドを実行する

bashパーティションファイルのリストと各グループでコマンドを実行する

私は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まったく繰り返す必要はありません。
  • ファイル名変数は常に二重引用符で囲む必要があります!
  • パスにスペースや改行文字が含まれていると、スクリプトに多くの問題が発生します。
  • ファイルが見つからない場合は、引数なしでコマンドを実行できないように追加されました-rxargs

それでも、

解析されないls

代わりに配列を使用する必要があります。

また、ファイル名の一部として改行文字に関連する問題を回避するため\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/*

おすすめ記事