以下を含むbashスクリプトがあります。
for i in $(stuff);
do other-stuff; cp -r $i $p;
done
しかし、特定のログダンプファイルタイプに対する読み取り権限がありません。.txtと呼びましょう。
現在、次のように表示されます。cp:読み取り用に `file.txt'を開くことができません:アクセスが拒否されました
権限を変更せずに、それらのファイルを除くすべてをコピーする簡単な方法はありますか?
ファイルが現在のユーザーによって読み取り可能かどうかをテストしますif [ -r "$i" ]。
for i in $(stuff);
if [ -r "$i" ]; do
cp -r $i $p
fi
done
詳細はこちら:ファイルテスト演算子
-r
フラグ...ファイルに読み取り権限がある場合はtrueを返します(テストを実行しているユーザーの場合)
-w
ファイルに書き込み権限があります(テストを実行しているユーザー用)
-x
ファイルに実行権限があります(テストを実行しているユーザーに対して)
cpそのメッセージを生成するときにハングしません。ファイルをスキップするだけです。詳細()を追加するcp -vr $i $pと、他のファイルのコピーでビジー状態になっているか、スクリプト内の他の何かがハングしていることがわかります。
cp繰り返し発生するファイルを除外する方法は実際にはありません。tarそれが必要な場合は、 (おそらくfind)やなど、より機能的なものに切り替える必要がありますrsync。
また、スペースが含まれている場合に備えて、引数を実際に引用する必要があります。cp -r "$i" "$p"
do other-stuff; $i =~ "*.txt" || cp -r $i $p;
ここでグループ化する必要があるかもしれません。演算子の優先順位を確認しなかったため、すべてを頭に入れておくことはできません。しかし~=、正規表現は行います。成功した場合、コピーはスキップされます。