0

あるディレクトリから別のディレクトリにファイルをコピーするコマンドがあります

FILE_COLLECTOR_PATH="/var/www/";
FILE_BACKUP_PATH='/home/'
ls  $FILE_COLLECTOR_PATH | head -${1} |  xargs -i basename {} | xargs -t -i cp $FILE_COLLECTOR_PATH{} "${FILE_BACKUP_PATH}{}-`date +%F%H%M%S%N`"

次のようなシェルスクリプトでループします。

#!/bin/sh
SLEEP=120
FILE_COLLECTOR_PATH="/var/www/";
FILE_BACKUP_PATH='/home/'
while true
do
ls  $FILE_COLLECTOR_PATH | head -${1} |  xargs -i basename {} | xargs -t -i cp $FILE_COLLECTOR_PATH{} "${FILE_BACKUP_PATH}{}-`date   +%F%H%M%S%N`"
 sleep ${SLEEP}
done

しかし、ディレクトリ内のすべてのファイルではなく、10個のファイルしか移動しないようです。なぜですか?すべてのファイルを移動することを想定する必要があります。

4

2 に答える 2

1

やってみてください

ls -1

だけlsでなくls、デフォルトでは、表示されるときに各ファイルの改行にファイルを表示しない(tail改行を期待する)ためですls -1

于 2012-10-19T17:44:37.777 に答える
1

一般に、スクリプトでの出力を解析しようとしないlsでください。さまざまな種類の微妙な問題が発生する可能性があります。ほとんどの場合、この仕事にはより優れたツールがあります。多くの場合、このツールはfindです。たとえば、ディレクトリ内のすべてのファイルのリストを生成し、それぞれに対して何かを行うには、次のようにします。

find <search directory> -maxdepth 1 -type f -print0 | xargs -0i basename {} ...

-print0and-0引数を使用するfindと、xargs特殊文字(スペースなど)を正しく処理する方法でファイル名を通信できます。

このfindコマンドには、バックアップスクリプトで役立つと思われる他のオプションがあります(これは、作成しているように見えます)。-mminおよびのようなオプションを-newer使用すると、最後の反復以降に変更されたファイルのみをバックアップできます。

于 2012-10-19T18:07:13.863 に答える