2017-12-04 15 views
0

スクリプトを使用して1つのフォルダから別のフォルダに100万を超えるファイルを移動しようとしていますが、ファイルが移動されず、エラーも発生しませんでしたそれらがフォルダ内の20個以上のレコードであるかどうかをチェックし、指定された別のフォルダに移動するかどうかを確認します。フォルダ間でファイルを移動しない

#!/bin/bash 

cd "/home/admin/Lulu/Bo/" 

check="ls | wc -l" 
if [ $(check) -gt 1 ] 
then 
    find ./ -name " oAS1_201613*.tar.gz"|grep -v bak| xargs -t -I {} mv {} /RS/2011/ 
fi 

どのようにこれを行うことができますか?

+1

Linuxにはフォルダはなく、ディレクトリのみがあります。 –

+1

*スクリプトが** 20以上のレコードであるかどうかをチェックする** - 現在のコードが** 1より大きいかどうかをチェック**レコード – RomanPerekhrest

答えて

3

ファイルが見つからない理由の1つは、指定したファイル名が間違っている可能性があります。あなたのファイルは本当にで始まり、のスペースで始まり、という文字で始まりますか?

アイテム数をカウントするのに理由がありますか? findの基準に一致するファイルが存在しないと、$(check) -gt 1になりますか?その場合、チェックを外すことができます。一致するファイルが見つからない場合は、findは何も行いません。

#!/bin/bash 

src="/home/admin/Lulu/Bo/" 

find "$src/" \ 
    -type f 
    -name "oAS1_201613*.tar.gz" \ 
    -not -name "*bak*" \ 
    -print0 | 
xargs -0 -t -I {} mv "{}" /RS/2011/ 

は、あなたが自分の名前に空白文字を含むファイルを処理できるように-print0xargs -0を、注意してください。

mvfindのオプションとして実行することもできます。代わりに-print0の、あなたがこれを使用する可能性があります:

find "$src/" ... -exec mv -v "{}" /RS/2011/ \; 

をあなたが本当にxargs -tの機能をエミュレートしたい場合は、行うことができ、複数の経由-execコマンドという。

xargsを使用するメリットの1つは、時には-Pオプションです。これにより、物事を並行して実行できます。一見すると、100万個のファイルを移動する "大きな"仕事が候補になると思われますが、とにかくIOバインドされる可能性が高いので、mvを並行して実行するとそれほど役に立ちませんこの場合、find .. -execは、xargsへのパイプと同じように機能します。

+0

ファイルの数をチェックしたい場合でも、 'ls' for that](http://mywiki.wooledge.org/ParsingLs) – tripleee

+0

@tripleee - はい、スクリプト内で' ls'の使用を推奨している状況を見つけるのは難しいでしょう。 :)この場合、配列にglobを入れて要素を数えることは実用的かどうかはわかりませんでした。「100万を超えるファイル」はかなりの数です。ちょうどそれをしないことを推奨するより良い賭けのように思えました。 – ghoti

+0

btw私はあなたが元の投稿を参照していることを知っているだけでなく、代わりに "201613"としてハードコードされた文字列をチェックする方が良いでしょう。 'find'コマンドの' ctime'、 'mtime'パラメータ:) – xxxvodnikxxx

関連する問題