このコマンドを使用すると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
。