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