0

このスクリプトでディレクトリをコピーしています

for dir in $(pwd)/*/
do
        dir=${dir%*/}
        dirsize=$(du -chk "${dir##*/}" | grep total)
        kbsize=${dirsize%total}
        if [[ "$kbsize" -lt 4194304 ]]
        then
                cp -rv * "$1"
        fi
done

ディレクトリが4GB未満の場合にのみディレクトリをコピーするようにしようとしています(FAT32の制限のため)。問題は、4GBを超えるディレクトリだけでなく、すべてをコピーすることです。

私のBASHの知識はそれほど素晴らしいものではないので、それはばかげたことだと確信しています。何か案は?

4

2 に答える 2

0

問題はあなたのduコマンドにあります。このコマンドを実行すると、次のようになります。

$ du -chk .
# ...
18M     total

その結果、kbsize変数には。が含まれます18M。そしてそれbashが好きではありません:

$  [[ 18M -lt 923898 ]]; echo $?
bash: [[: 18M: value too great for base (error token is "18M")
1

du -skコマンドを:に置き換えます

$ kbsize=$(du -sk . | awk '{print $1}')
$ echo $kbsize
18196
$ [[ $kbsize -lt 4194304 ]]; echo $?
0 # Success!
$ [[ $kbsize -lt 10 ]]; echo $?
1 # Fails, but no errors
于 2013-01-14T19:35:11.080 に答える
0

cpステートメントの*inは、のすべてのディレクトリ名を含むように拡張されていますpwd。したがって、いずれかのディレクトリが4 GB未満の場合、すべてのディレクトリをコピーしようとします。

-tこのオプションを使用cpして、ファイルのコピー先のターゲットディレクトリを指定し、そのコマンドから*を削除することをお勧めします。

また、他の人が述べているように、への-sオプションをチェックしてくださいdu

于 2013-01-14T19:51:18.887 に答える