-bash: /usr/bin/ls: パラメーターのリストが長すぎます。

-bash: /usr/bin/ls: パラメーターのリストが長すぎます。

このコマンドを使用するとls repo/* | xargs -I {} cp {} backup_repo/エラーが発生します-bash: /usr/bin/ls: Argument list too long。私はこれが起こる理由は、bashが実際に一致する各ファイルにアスタリスクを拡張して非常に長いコマンドラインを生成するためであることを知っています。このエラーをどのように解決できますか?

答え1

xargs --show-limits </dev/null現在の制限を表示するために使用されます。

より良い方法:

find repo -maxdepth 1 -type f -name '*' -print0 | \
  xargs -0 --no-run-if-empty  \
    cp --target-directory=./backup_repro/

バックアップしたいファイルと同じディレクトリにバックアップディレクトリを置くことはお勧めできません。以下を含むバックアップを含むバックアップが作成され、バックアップサイズは無限大に近づくことがあります。

読むman find xargs cp

答え2

repoにコピーするには、次のようにbackup_repoしますrsync

rsync -a repo/ backup_repo

または、バックアップのみが必要な場合はアーカイブを作成してくださいtar

tar -c -f repo.tar repo

*内部で拡張されているように見える名前だけをコピーし、隠されrepoた名前(たとえば.git)をスキップするには、次のようにします。

printf '%s\0' repo/* | xargs -0 -I {} cp -R -- {} backup_repo

またはGNUを仮定するとcp

printf '%s\0' repo/* | xargs -0 cp -t backup_repo -R --

このprintfユーティリティはシェルに組み込まれているため、パラメータリストサイズbashに外部ユーティリティと同じ制限はありませんls

関連情報