-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

関連情報